使用以下C代码输出错误

时间:2012-08-10 13:16:14

标签: c scanf

#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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

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

答案 1 :(得分: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 FAQ,但我找不到链接。)