首页 > 解决方案 > 以下 c++ 代码有什么问题?

问题描述

问题是 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++ 新手,所以知道我可以改进什么对我有很大帮助。

标签: c++string-comparison

解决方案


正如Thomas所说,您应该检查 len 是否 > 3。字符串基本上是由空字节或 '\0' 终止的字符数组。在内存中,这表示为 ['o', 'n', 'e', '\0', ?, ...] 其中 ? 是垃圾值,或者,正如 C/C++ 所说,非法内存访问。因此,"one"[4] == c 或 "two"[4] == c 有可能为真,因为我们不知道存储在那里的值。如果发生这种情况,那么这条线

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

会有问题。


推荐阅读