【问题标题】:What is the problem with the following c++ code? [closed]以下 c++ 代码有什么问题? [关闭]
【发布时间】:2019-12-28 18:50:30
【问题描述】:

问题是 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++ 新手,因此知道我可以改进哪些方面对我有很大帮助。

【问题讨论】:

  • len 为 3 或更多时会发生什么????使用调试器。 :-) 提示:"one"[4]
  • 由于您没有使用任何 C++ 特定功能,您可能希望使用 C 进行编译和编码。C++ 语言有 std::string 而 C 没有。
  • 程序基本上忽略了我的想法。 3 twoone onetwo twotwo 给出 ` 3 3 3 `
  • 我是 C++ 新手 -- 在编写任何代码之前,您应该考虑如何解决问题。网站上的问题与 C++ 关系不大。

标签: c++ string-comparison


【解决方案1】:

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

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

会有问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 2015-02-23
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2022-06-15
      • 2018-03-12
      相关资源
      最近更新 更多