我有这个代码块(函数省略,因为逻辑是家庭作业的一部分):
#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;
}
Run Code Online (Sandbox Code Playgroud)
前两个Scanf的工作很好,没有问题,一旦我们进入while循环,我有一个问题,当你应该被提示输入一个新的形状char时,它会跳转到printf
Length的长度并等待输入从那里获取一个char,然后是循环的下一次迭代的小数.
Preloop迭代:
Scanf:形状.Works Great
Scanf:长度.没问题
循环1.
Scanf:形状.跳过此
Scanf:长度.问题,这个scanf映射到形状char.
循环2
Scanf:形状.跳过此
Scanf:长度.问题,这个scanf现在映射到int大小.
它为什么这样做?
Tho*_*thy 38
scanf("%c")
从ENTER键中读取换行符.
当你输入时15
,你输入a 1
,a 5
然后ENTER按键.所以输入缓冲区中现在有三个字符.scanf("%d")
读取1
和5
解释它们作为数字15
,但换行符仍然在输入缓冲区中.该scanf("%c")
会立即阅读换行符,然后程序将进入到下一个scanf("%d")
,并等待你输入一个数字.
通常的建议是读取整行输入fgets
,并在单独的步骤中解释每行的内容.对您当前问题的一个更简单的解决方案是getchar()
在每个之后添加一个scanf("%d")
.
Jon*_*ler 19
基本问题是scanf()
将新行留在缓冲区中的数字后面,然后%c
在下一遍中读取它.实际上,这很好地证明了我不使用的原因scanf()
; 我使用线路阅读器(fgets()
例如)和sscanf()
.它更容易控制.
你可以通过使用" %c"
而不是"%c"
格式字符串来拯救它.空白导致scanf()
在读取字符之前跳过空格(包括换行符).
但它会从长远来看更容易放弃scanf()
和fscanf()
并使用fgets()
或同等学历加sscanf()
.除此之外,当您使用整个字符串时,错误报告会更容易,而不是在scanf()
失败后留下的小滴.
您还应始终检查是否获得了转换后的值scanf()
.输入失败 - 经常和可怕.因为你没有检查,所以不要让它破坏你的程序.
使用该功能
void seek_to_next_line( void )
{
int c;
while( (c = fgetc( stdin )) != EOF && c != '\n' );
}
Run Code Online (Sandbox Code Playgroud)
清除输入缓冲区.
小智 5
尝试在scanf中添加空格.
scanf(" %d", &var);
// ^
// there
Run Code Online (Sandbox Code Playgroud)
这将导致scanf()
在匹配整数之前丢弃所有空格.
归档时间: |
|
查看次数: |
81439 次 |
最近记录: |