【问题标题】:Why this program is generating wrong answer?为什么这个程序会产生错误的答案?
【发布时间】:2015-10-04 10:56:30
【问题描述】:

这个程序没有给出正确的输出;并且在 for 循环中第一次进入时,它只接受一次输入而不是 't' 次。

这个问题是 HEADBOB (https://www.codechef.com/problems/HEADBOB)

#include <stdio.h>
int main()
{
    int t;
    scanf("%d", &t);
    for(t; t>0; t--)
    {
        int J=0, Y=0, N=0, I=0, len=0;
        if(len==0)
        scanf("%d", &len);
        char ar[len];
        for(J=0; J<len; J++)
        {
            scanf("%c",&ar[J]);
            if(ar[J]=='Y')
                Y++;
            else if(ar[J]=='N')
                N++;
            else if(ar[J]=='I')
                I++;
        }
        if(I>0)
            printf("INDIAN\n");
        else
        {
            if((Y&&!N)||(N&&!Y))
                printf("NOT SURE\n");
            else if(Y&&N) printf("NOT INDIAN\n");
        }
    }
}

输入:

测试用例数

字符数

N 个字符

上述代码的输入和输出示例:

输入:

5

5

NNYNN

输出:

不是印度人

【问题讨论】:

  • if(len==0) 始终为真。
  • 我投票决定将此问题作为题外话结束,因为 SO 不是调试服务。
  • 全大写名称通常保留给宏和常量。使用全部大写意味着你在对别人大喊大叫

标签: c arrays character


【解决方案1】:

检查scanf("%c", &amp;ar[j]) 是否正在读取空白字符!想想

scanf(" %c", &ar[j]);

这意味着跳过所有空白字符(空格、制表符、\ns 等)。 甚至更好:

scanf("%d", &len);
char ar[len + 1]; // + 1 for 0-termination
scanf(" %s", ar); // skip all whitespace characters, then read a string

一次读取完整字符串要快得多。

【讨论】:

    【解决方案2】:

    问题在于第二个 scanf (scanf("%d", &amp;len);) 在标准输入流 (stdin) 中留下了一个换行符。然后在循环的第一次迭代中,第三个scanf (scanf("%c",&amp;ar[J]);) 会使用此字符。

    变化

    scanf("%d", &len);
    

    scanf("%d%*c", &len);
    

    将解决问题。 %*c 告诉 scanf 读取并丢弃一个字符。

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2018-03-17
      • 2013-03-10
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多