C语言程序从标准输入读取字符参数时输出异常问题求助
问题根源:
scanf读取字符时未跳过空白字符 你的问题出在最后读取三个字符的scanf调用上——前面的scanf读取整数/浮点数后,输入流里残留的**空白字符(空格/换行)**被%c直接读取了,导致实际读入的字符和你预期的不一致。
具体分析
看你的输入序列:5 1.3 8 8 fgd,当程序执行到:
scanf("%i", &width);
时,它会读取第二个8,但输入流里8后面的空格还留在缓冲区里。接下来执行:
scanf("%c%c%c", &c1, &c2, &c3);
%c不会自动跳过空白字符,所以它会把那个残留的空格读进c1,然后把f读进c2,g读进c3——这就是为什么你输出的是88 fg(c1是空格,c2是f,c3是g),而不是预期的88fgd。
解决方案
在读取字符的scanf格式串最前面加一个空格,让它自动跳过所有前置空白字符:
scanf(" %c%c%c", &c1, &c2, &c3);
这里的空格会告诉scanf忽略任何空白字符(空格、换行、制表符等),直到遇到第一个非空白字符,然后再依次读取三个字符。这样就能正确读入f、g、d,输出就会符合预期的88fgd了。
额外小提示
你的radius函数还有个小问题:当rad < 0时,你打印了Obvod: 0 Obsah: 0,但后面仍然会计算正常的周长和面积并赋值给lep和sqp。如果这不是你想要的逻辑,可以把计算和赋值的代码放进else块里:
void radius (float rad, float* lep, float* sqp) { const float pi = 3.14159; if (rad < 0) { printf("Obvod: 0 Obsah: 0\n"); *lep = 0; *sqp = 0; return; } float lenght = 2 * pi * rad; float square = pi * (rad * rad); *lep = lenght; *sqp = square; printf("Obvod: %f Obsah: %f\n", lenght, square); }
内容的提问来源于stack exchange,提问作者wybot
相关产品推荐
相关产品推荐

