无法识别 scanf 格式字符串

scanf format string not recognized

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

a b c d e

在 e 字母后我按下了 Enter,但程序在 scanf 上阻塞,因为 i 等于 3。 似乎 scanf 无法从标准输入中获取其他字符。 预先感谢您的帮助。

    #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 一次获取单个字符不是一个好主意。如果用户键入多个字符,您可能会溢出缓冲区,因为没有空间容纳空字符。这也会在标准输入中留下多余的字符。

另一个想法是使用特殊格式字符串标志一次获取 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 之后的 space -- space 导致 scanf 读取输入并跳过 whitespace 直到它找到非白色 space 字符。该非白色 space 字符将作为下一个要读取的字符保留在 FILE 输入缓冲区中。所以在循环的第 5 次迭代 (i == 4) 中,它读取 e 然后读取白色 space 寻找非白色 space。所以换行符被跳过(它是白色的space)并且它开始(试图)读取阻塞的下一行。

一旦您提供下一行(假设它不是 empty/all 白色 space),它将得到一个非白色 space 字符并且 scanf 将 return.