-3
#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

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

4

2 回答 2

9

scanf()输入流中仍然有一个从初始(和后续s)开始的换行符scanf():这将被分配给option并且后续int分配将失败,因为C 不是int, 含义l并且m是未初始化的int变量。

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

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

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

if (3 == scanf(" %c %d %d",&option,&l,&m))
{
    /* Valid input. */
}
于 2012-08-10T13:22:01.940 回答
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 常见问题解答,但我找不到链接。)

于 2012-08-10T13:24:11.943 回答