猿问

C:多扫描,当我为一个扫描输入一个值时,它跳过了第二个扫描

C:多扫描,当我为一个扫描输入一个值时,它跳过了第二个扫描

我有这段代码(省略了一些函数,因为逻辑是作业的一部分):

#include <stdio.h>int main(){
    char c = 'q';
    int size; 

    printf("\nShape (l/s/t):");
    scanf("%c",&c);

    printf("Length:"); 
    scanf("%d",&size);

    while(c!='q')
    {
        switch(c)
        {
            case 'l': line(size); break; 
            case 's': square(size); break;
            case 't': triangle(size); break; 
        }


        printf("\nShape (l/s/t):");
        scanf("%c",&c);

        printf("\nLength:"); 
        scanf("%d",&size);
    }

    return 0; }

前两个Scanf的工作很棒,没有问题,一旦我们进入while循环,我就遇到了一个问题,当您被提示输入一个新的形状字符时,它会跳到printf的长度,然后等待从其中获取输入的字符,然后是循环下一次迭代中的小数点。

预循环迭代:

Scanf:形状。伟大的作品
长度。没问题

循环1。

Scanf:形状。跳过这个
长度。问题,这个扫描映射到形状焦。

循环2
Scanf:形状。跳过这个
长度。问题,这个扫描器现在映射到int大小。

它为什么要这么做?


largeQ
浏览 517回答 3
3回答

白猪掌柜的

scanf("%c")从进入钥匙。当你打字的时候,比如说15,你键入a1..5然后按下进入钥匙。因此,现在输入缓冲区中有三个字符。scanf("%d")读取1而5,将它们解释为数字15,但是换行符仍然在输入缓冲区中。这个scanf("%c")将立即读取这个换行符,然后程序将继续到下一个scanf("%d")等你输入一个号码。通常的建议是用fgets,并在单独的步骤中解释每一行的内容。对于当前问题,一个更简单的解决方案是添加一个getchar()每次之后scanf("%d").

泛舟湖上清波郎朗

最基本的问题是scanf()在缓冲区中的数字后面保留换行符,然后用%c下一次。实际上,这很好地证明了我为什么不使用scanf();我使用行读取器(fgets()(例如)和sscanf()..它更容易控制。你也许可以用" %c"而不是"%c"格式字符串。空白原因scanf()在读取字符之前跳过空白(包括换行符)。但从长远来看,放弃是比较容易的。scanf()和fscanf()和使用fgets()或同等加sscanf()..除此之外,当您使用整个字符串时,错误报告要容易得多,而不是由scanf()在失败之后。您还应该始终检查是否将值转换为scanf()..输入失败-例行公事和可怕。不要因为你没有检查就让它破坏你的程序。

慕无忌1623718

使用函数void&nbsp;seek_to_next_line(&nbsp;void&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(c&nbsp;=&nbsp;fgetc(&nbsp;stdin&nbsp;))&nbsp;!=&nbsp;EOF&nbsp;&&&nbsp;c&nbsp;!=&nbsp;'\n'&nbsp;);}若要清除输入缓冲区,请执行以下操作。
随时随地看视频慕课网APP
我要回答