以下 C++ 代码有什么问题?

What is the problem with the following c++ code?

本文关键字:问题 什么 C++ 代码 以下      更新时间:2023-10-16

问题是 12289 - 来自在线法官的一二三 https://onlinejudge.org/external/122/12289.pdf 我必须将给定的字符串 s 与以下内容进行比较:"一"、"二"、"三",并返回一个数字,指示其中哪个字符串在字符串的正确位置具有最正确的字符。 以下是我试图得到一个被接受的答案。

#include <cstdio>
using namespace std;
int main(){
char c;
int t,len,c1,c2;
scanf("%dn",&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("%dn",3);
else if (c1>c2) printf("%dn",1);
else printf("%dn",2);
}
printf("n");
}

我在这个问题中得到了一个"错误的答案",这通常不涉及格式问题。我是C++新手,所以了解我可以改进的地方对我有很大帮助。

正如托马斯所说,你应该检查 len 是否> 3。字符串基本上是以空字节或"\0"结尾的字符数组。在内存中,这表示为 ['o', 'n', 'e', '\0', ?, ...] 其中 ?是垃圾值,或者 C/C++ 称之为非法内存访问。因此,"一"[4] == c 或"二"[4] == c 有可能为真,因为我们不知道存储在那里的值。如果发生这种情况,那么该行

else if (c1>c2) printf("%dn",1);

会有问题。

感谢您的支持。我发现真正的问题是输入的格式。两个连续输入之间有空行,因此if(c=='n') break;部分造成了一些麻烦。 无论如何,我将尝试按照C++指南重新制定解决方案。我只是不知道如何处理字符串,所以我想逐个字符地做。我正在关闭线程。