使用以下C代码输出错误

sac*_*ula -3 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

3(Input)
3
C 1 4(Input)

 0 -374066224C 1 4
Run Code Online (Sandbox Code Playgroud)

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

hmj*_*mjd 9

还有从初始输入流中的换行字符scanf()(和随后的scanf()词):这将被分配到option和后续的int作为分配将失败C 不是int,意义lm是未初始化的int变量.

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

scanf(" %c %d %d",&option,&l,&m);
    /* ^ */
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为了记录,初始空间解决问题的原因是标准的这一部分:7.21.6.2/5(scanf函数)"由空白字符组成的指令通过读取输入到第一个来执行非空格字符(仍未读取),或者直到不再能读取字符为止.指令永远不会失败." (2认同)