【问题标题】:Wrong output with the following C code [duplicate]以下C代码输出错误[重复]
【发布时间】:2012-08-10 13:16:13
【问题描述】:
#include <stdio.h>

int main(){
    int l,m,q,j;
    char option;
    scanf("%d",&q);
    printf("%d\n",q);
    for(j=0;j<q;j++){
        scanf("%c %d %d",&option,&l,&m);
        printf("%c %d %d",option,l,m);
    }
    return 0;
}

输出:

3(Input)
3
C 1 4(Input)

 0 -374066224C 1 4

上面的代码有什么问题?它没有给出预期的输出。

【问题讨论】:

  • 您的预期输出是什么?
  • 什么预期的输出?您是否尝试调试它?似乎存在与家庭作业相关的问题......
  • @Levon 这不是功课,我尝试使用 gdb 进行调试但没有用。预期输出应与输入相同

标签: c scanf


【解决方案1】:

输入流中仍然有一个来自初始 scanf()(以及随后的 scanf()s)的换行符:这将被分配给 option,随后的 int 分配将失败,因为 C 是不是int,意味着lm 是未初始化的int 变量。

若要跳过它,请在for 循环内的scanf() 的格式说明符中添加一个前导空格字符:

scanf(" %c %d %d",&option,&l,&m);
    /* ^ */

scanf() 的返回值是成功分配的次数:检查它以确保 3 分配成功。

if (3 == scanf(" %c %d %d",&option,&l,&m))
{
    /* Valid input. */
}

【讨论】:

  • 这解决了问题,但请你解释一下为什么会有换行符
  • @sachinirukula,当用户输入他们输入的数字时,他们键入3 并按回车键。返回将一个换行符插入到输入流中。 scanf() 不使用换行符,将其留在输入流中。
  • @sachinirukula 之所以要追溯到古代称为打字机的东西。当您按下它们的等效键进入时,机器会回车(回到纸的最左侧),然后换行。 Windows 的工作方式相同。 Windows 文本文件甚至以 ASCII 符号 '\r' (ASCII 13) '\n' (ASCII 10) 结束每一行,它们分别称为回车和换行。
  • 为了记录,初始空格解决问题的原因是标准的这一部分:7.21.6.2/5(scanf函数)“由空格字符组成的指令是通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。指令永远不会失败。"
【解决方案2】:

每次你提示用户输入时,他们都会写下来,然后按回车键。 Enter 在输入缓冲区中留下换行符。您必须在要求输入字符之前将其丢弃,否则它将最终出现在您的字符变量中。

简单但直接的解决方案是这样的:

scanf("%d",&q); getchar();
printf("%d\n",q);
for(j=0;j<q;j++){
    scanf("%c %d %d",&option,&l,&m); getchar();
    printf("%c %d %d",option,l,m);
}

(我很确定某处有一个 C 常见问题解答,但我找不到链接。)

【讨论】:

  • hmjd 的解决方案更漂亮,所以我会去。
猜你喜欢
  • 2014-08-30
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多