无法识别scanf格式字符串

无法识别scanf格式字符串,c,input,buffer,scanf,stdin,C,Input,Buffer,Scanf,Stdin,我已经为以下程序插入了以下输入: a b c d e 在e字母之后,我按Enter键,但程序在scanf上阻塞,因为I等于3。 似乎scanf无法从stdin获取其他字符。 提前感谢你的帮助 #include <stdio.h> #include <stdlib.h> int main() { char a[5]; for (int i = 0; i < 5; i++) {

我已经为以下程序插入了以下输入:

a b c d e
在e字母之后,我按Enter键,但程序在scanf上阻塞,因为I等于3。 似乎scanf无法从stdin获取其他字符。 提前感谢你的帮助

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        char a[5];
        for (int i = 0; i < 5; i++)
        {
            scanf("%c ", a + i);
            printf("i = %d a[%d] = %c \n", i, i, a[i]);
        }

        int i = 0;
        while( i < 5 )
        {
            printf("%c ", a[i]);
            i++;
        }

        return 0;
    }

使用scanf一次从stdin获取一个字符不是一个好主意。如果用户键入多个字符,则会导致缓冲区溢出,因为没有空间容纳空字符。这也会在stdin中留下多余的字符

另一种方法是使用一个特殊的格式字符串标志一次提取5个字符,然后打印它们或对它们执行任何操作

您可以使用标志%5c,其中5是任何整数,它可以读取、扫描5个字符

这是您的代码的修改版本

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[5];
    scanf("%5c", a);

    int i = 0;
    while( i < 5 )
    {
        printf("%c ", a[i]);
        i++;
    }

    return 0;
}

现在没有阻塞。

当i==3时它不会阻塞-它完成了迭代-当i==4时它会阻塞

这是因为scanf格式的%c后面有空格-空格会导致scanf读取输入并跳过空格,直到找到非空格字符为止。然后,该非空白字符将作为下一个要读取的字符留在文件输入缓冲区中。所以在循环i==4的第5次迭代中,它读取e,然后读取空白,寻找非空白。因此,换行符跳过了它的空白,它开始尝试读取下一行的块


一旦你提供下一行,假设它不是空的/全部是空白,它将得到一个非空白字符,scanf将返回。

这是错误的,会溢出缓冲区,因为你需要为字符串的nul终止留出空间。我的意思是,它在stdin中保留了未使用的字符,我将进行编辑。这不起作用。%scanf中的s将在第一个空白处终止。因此,只有字符a将被读取到数组中。将其更改为%5c,这适用于空白字符。@JoshWeinstein我认为这也不起作用,因为空格也将被读取到数组中。因此,如果用户键入一个bcd e,那么数组a中的5个插槽将最终包含这5个字符:abc。