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

时间:2019-12-28 18:50:30

标签: c++ string-comparison onlinejudge

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

#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");
}

我在此问题中得到“错误答案”,通常不涉及格式问题。我是C ++的新手,因此它可以帮助我很多我可以改进的地方。

2 个答案:

答案 0 :(得分:1)

正如Thomas所说,您应该检查len是否大于3。字符串基本上是由空字节或'\ 0'终止的字符数组。在内存中,它表示为['o','n','e','\ 0',?,...],其中?是垃圾值,或者如C / C ++所称,是非法内存访问。因此,由于我们不知道存储在其中的值,因此有可能使“一个” [4] == c或“两个” [4] == c为真。如果发生这种情况,则该行

    else if (c1>c2) printf("%d\n",1);

会有问题。

答案 1 :(得分:0)

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