为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
largeQ 2019-07-04 17:36:19
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:形状。跳过这个长度。问题,这个扫描映射到形状焦。循环2Scanf:形状。跳过这个长度。问题,这个扫描器现在映射到int大小。它为什么要这么做?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

scanf("%c")进入钥匙。

当你打字的时候,比如说15,你键入a1..5然后按下进入钥匙。因此,现在输入缓冲区中有三个字符。scanf("%d")读取15,将它们解释为数字15,但是换行符仍然在输入缓冲区中。这个scanf("%c")将立即读取这个换行符,然后程序将继续到下一个scanf("%d")等你输入一个号码。

通常的建议是用fgets,并在单独的步骤中解释每一行的内容。对于当前问题,一个更简单的解决方案是添加一个getchar()每次之后scanf("%d").


查看完整回答
反对 回复 2019-07-04
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

最基本的问题是scanf()在缓冲区中的数字后面保留换行符,然后用%c下一次。实际上,这很好地证明了我为什么不使用scanf();我使用行读取器(fgets()(例如)和sscanf()..它更容易控制。

你也许可以用" %c"而不是"%c"格式字符串。空白原因scanf()在读取字符之前跳过空白(包括换行符)。

但从长远来看,放弃是比较容易的。scanf()fscanf()和使用fgets()或同等加sscanf()..除此之外,当您使用整个字符串时,错误报告要容易得多,而不是由scanf()在失败之后。

您还应该始终检查是否将值转换为scanf()..输入失败-例行公事和可怕。不要因为你没有检查就让它破坏你的程序。


查看完整回答
反对 回复 2019-07-04
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

使用函数

void seek_to_next_line( void ){
    int c;
    while( (c = fgetc( stdin )) != EOF && c != '\n' );}

若要清除输入缓冲区,请执行以下操作。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 516 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信