2010-09-25 64 views
0

我正在尝试使用5个字符和5个浮点数输入。同时扫描字符和浮点数时出现问题

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

fflush()未在输入流上定义,如stdin。不要这样做。

如果你想“读和丢弃,直到换行”,然后执行:

int ch; 
do { 
    ch = getchar(); 
} while (ch != EOF && ch != '\n'); 

注意%c意味着“读取输入流中的下一个字符,即使它是空白,然后停止”。 %f表示“读取并放弃空格,然后尝试从输入流中读取一个浮点数,然后停止。”

+0

它仍然没有工作。 – Mohit 2010-09-25 06:47:02

2

Use of scanf is not recommended因为这样的问题。

而是使用fgets读取整个行,然后用sscanf提取你想要什么(一charfloat)从线刚读:

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)); 

    } 
+0

我无法找到我的代码的这种行为的原因。你能向我解释一下吗? – Mohit 2010-09-25 07:03:12

1

要直接回答为什么第三和所有其他扫描“跳过”,这是scanf()%c格式的工作方式。当拨打电话scanf()时,您通常必须按Enter才能“提交”输入。因此,将一个换行符插入到stdin流中。

当前一次浮动扫描得到输入时,换行符仍保留在流中。当字符扫描到达时,剩余的换行符会被读入,因为它可以有效地“跳过”呼叫。

使用fgets()sscanf() codaddict建议。

但是作为一个快速修复,您可以尝试在浮动扫描之后添加对getchar()的调用,以消耗流中的换行符。

编辑:
您是说这不起作用? (假设你输入了正确类型的值,每scanf函数调用之一)

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(); 
    } 
} 
+0

甚至连getchar()都不起作用。我甚至使用过fflush(stdin),但结果仍然是一样的。 – Mohit 2010-09-25 07:06:37

+0

它仍然无法正常工作。 – Mohit 2010-09-25 07:18:20

+0

谢谢,这是行得通的。我第一次弄错了。 – Mohit 2010-09-25 16:49:52

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');,因为您使用循环。

0

问题在float值后扫描char值。

解决方法非常简单!

,而不是书面方式你像这样的代码

scanf("%c",&...) 

试试这个,

scanf(" %c",&...) 

太空前的“%C”将解决被忽视的价值回归问题(输入)键,然后将浮点值输入为输入。

当在字符值之前扫描浮点值时。 按下Return(Enter)键获得的值将收集在以下char变量中。使用之前的空格(“%c”,& ...)会丢弃返回(回车)键所收集的值,导致Char值在下一行中被扫描。因此解决了Scanning Float-Char问题。

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; 
    }