我想尝试五个字符和五个浮动输入。
main()
{
char c[5];
float q[5];
int i;
for(i=0;i<5;i++)
{
printf("\n%d ",i);
scanf("%c",c+i);
scanf("%f",q+i);
}
}
但输出很荒谬。在两次连续扫描之后,它会跳过第三次扫描,然后再次跳过第五次扫描。 我无法理解为什么会出现这种行为。 我正在研究gcc编译器。
答案 0 :(得分:2)
Use of scanf is not recommended因为这样的问题。
而是使用fgets
阅读整行,然后使用sscanf
从刚才读取的行中提取您想要的内容(char
或float
): / p>
char line[MAX];
for(i=0;i<5;i++)
{
if( fgets(line,MAX,stdin) && sscanf(line,"%c", c+i)!=1 )
*(c+i) = 0;
if( fgets(line,MAX,stdin) && sscanf(line,"%f", q+i)!=1 )
*(q+i) = 0.0;
printf("%c %f\n",*(c+i),*(q+i));
}
答案 1 :(得分:2)
要直接回答第3次和其他扫描“跳过”的原因,scanf()
和%c
格式的工作方式。当呼叫scanf()
时,您通常必须按Enter键以“提交”输入。因此,在stdin
流中插入换行符。
当输入上一个浮动扫描时,换行符仍保留在流中。当达到字符扫描时,读入剩余的换行符,因为它有效地“跳过”了呼叫。
你 应该fgets()
使用sscanf()
作为codaddict建议。
但作为快速修复,您可以尝试在浮动扫描后添加对getchar()
的调用以使用流中的换行符。
修改强>
你说这不起作用? (假设您输入了正确类型的值,每次扫描调用一次)
main()
{
char c[5];
float q[5];
int i;
for(i=0;i<5;i++)
{
printf("\n%d ",i);
scanf("%c",c+i);
scanf("%f",q+i);
getchar();
}
}
答案 2 :(得分:1)
你应该试试这个:
int main(){
char c[6];//char array size must be 6 to store five charecter
//as null-terminator('\0')will use the last one
float q[5];
int i;
for(i=0;i<5;i++){
printf("\n%d\n",i);fflush(stdout);
scanf("%c",&c[i]);fflush(stdin);//fflush(stdin) to clear input stream that
//next scanf() won't skip
scanf("%f",&q[i]);fflush(stdin);//fflush(stdin) to clear input stream that
//scanf() won't skip at new loop
}
return 0;
}
答案 3 :(得分:0)
fflush()
未在输入流上定义,例如stdin
。不要这样做。
如果您想“读取并丢弃直到换行”,请执行以下操作:
int ch;
do {
ch = getchar();
} while (ch != EOF && ch != '\n');
请注意,%c
表示“读取输入流中的下一个字符,即使它是空格,然后停止”。 %f
表示“读取并丢弃空格,然后尝试从输入流中读取浮点数,然后停止。”
答案 4 :(得分:0)
您的代码应该是这样的:
main()
{
char c[5];
float q[5];
int i;
for(i=0;i<5;i++)
{
printf("\n%d ",i);
scanf("%c",c+i);
while (getchar()!='\n');
scanf("%f",q+i);
while (getchar()!='\n');
}
}
句子while (getchar()!='\n');
搜索直到输入结束,因此它不会将'\ n'作为q + i的输入值。另外在scanf q + i之后的另一个while (getchar()!='\n');
,因为你使用循环。
答案 5 :(得分:0)
问题。
解决方案非常简单!!!
而不是像这样编写代码
scanf("%c",&...)
试试这个,
scanf(" %c",&...)
“%c”之前的空格将通过在键入float的值作为输入后忽略按下Return(Enter)键的值来解决问题。
在字符值之前扫描浮点值。 按Return(Enter)键获得的值将收集在以下char变量中。使用之前的空格(“%c”,&amp; ...)将丢弃Return(Enter)键收集的值,导致在下一行中扫描Char值。因此解决了扫描Float-Char问题。