You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:27:39