下面的c++代码有什么问题?
What is the problem with the following c++ code?
问题是 12289 - https://onlinejudge.org/external/122/12289.pdf 在线裁判的一二三
我必须将给定的字符串 s 与以下内容进行比较:"one"、"two"、"three" 和 return 一个数字,指示其中哪些具有最正确的字符字符串的正确位置。
以下是我尝试获得接受的答案。
#include <cstdio>
using namespace std;
int main(){
char c;
int t,len,c1,c2;
scanf("%d\n",&t);
while(t--){
len = 0;
c1 = 0;
c2 = 0;
while(true){
scanf("%c",&c);
if(c=='\n') break;
if("one"[len] == c) c1++;
if("two"[len] == c) c2++;
len++;
}
if(len>3) printf("%d\n",3);
else if (c1>c2) printf("%d\n",1);
else printf("%d\n",2);
}
printf("\n");
}
我在这个问题中得到 "Wrong answer",通常不涉及格式问题。我是 C++ 的新手,所以了解我可以改进的地方对我有很大帮助。
正如 Thomas 所说,您应该检查 len 是否 > 3。字符串基本上是以空字节或“\0”结尾的字符数组。在内存中,这表示为 ['o'、'n'、'e'、'\0'、?、...] 其中?是垃圾值,或者如 C/C++ 所称,非法内存访问。因此,"one"[4] == c 或 "two"[4] == c 有可能为真,因为我们不知道存储在那里的值。如果发生这种情况,那么行
else if (c1>c2) printf("%d\n",1);
会有问题。
感谢您的支持。我发现真正的问题是输入的格式。两个连续的输入之间有空行,所以 if(c=='\n') break;
的部分造成了一些麻烦。
无论如何,我将尝试按照 C++ 指南重新制作解决方案。我只是不知道如何处理字符串,所以我想到了一个字符一个字符地处理。我要关闭线程了。
问题是 12289 - https://onlinejudge.org/external/122/12289.pdf 在线裁判的一二三 我必须将给定的字符串 s 与以下内容进行比较:"one"、"two"、"three" 和 return 一个数字,指示其中哪些具有最正确的字符字符串的正确位置。 以下是我尝试获得接受的答案。
#include <cstdio>
using namespace std;
int main(){
char c;
int t,len,c1,c2;
scanf("%d\n",&t);
while(t--){
len = 0;
c1 = 0;
c2 = 0;
while(true){
scanf("%c",&c);
if(c=='\n') break;
if("one"[len] == c) c1++;
if("two"[len] == c) c2++;
len++;
}
if(len>3) printf("%d\n",3);
else if (c1>c2) printf("%d\n",1);
else printf("%d\n",2);
}
printf("\n");
}
我在这个问题中得到 "Wrong answer",通常不涉及格式问题。我是 C++ 的新手,所以了解我可以改进的地方对我有很大帮助。
正如 Thomas 所说,您应该检查 len 是否 > 3。字符串基本上是以空字节或“\0”结尾的字符数组。在内存中,这表示为 ['o'、'n'、'e'、'\0'、?、...] 其中?是垃圾值,或者如 C/C++ 所称,非法内存访问。因此,"one"[4] == c 或 "two"[4] == c 有可能为真,因为我们不知道存储在那里的值。如果发生这种情况,那么行
else if (c1>c2) printf("%d\n",1);
会有问题。
感谢您的支持。我发现真正的问题是输入的格式。两个连续的输入之间有空行,所以 if(c=='\n') break;
的部分造成了一些麻烦。
无论如何,我将尝试按照 C++ 指南重新制作解决方案。我只是不知道如何处理字符串,所以我想到了一个字符一个字符地处理。我要关闭线程了。