扫描char并同时浮动时出现问题

时间:2010-09-25 06:30:39

标签: c arrays types

我想尝试五个字符和五个浮动输入。

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编译器。

6 个答案:

答案 0 :(得分:2)

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

而是使用fgets阅读整行,然后使用sscanf从刚才读取的行中提取您想要的内容(charfloat): / 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)

在浮点值之后扫描char值时

问题

解决方案非常简单!!!

而不是像这样编写代码

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

试试这个,

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

“%c”之前的空格将通过在键入float的值作为输入后忽略按下Return(Enter)键的值来解决问题。

  

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