scanf格式字符串无法识别

时间:2018-05-14 17:55:06

标签: c input buffer scanf stdin

我'已插入以下程序的以下输入:

a b c d e

在电子信件之后我按了Enter键,但是scanf上的程序阻塞等于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;
    }

2 个答案:

答案 0 :(得分:3)

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

这是因为scanf格式中的%c之后的空格 - 空格导致scanf读取输入并跳过空白,直到找到非空白字符。然后,该非空白字符将作为要读取的下一个字符保留在FILE输入缓冲区中。因此,在循环的第5次迭代(i == 4)中,它读取e然后读取空白以查找非空白。所以跳过了换行符(它是空格)并且它开始(试图)读取下一行阻塞。

一旦你提供下一行(假设它不是空/所有空格),它将获得一个非空白字符,scanf将返回。

答案 1 :(得分:-2)

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

另一个想法是使用特殊格式字符串标记一次获取5个字符,然后打印它们或用它们做任何你想做的事。

您可以使用标记UIScrollViewDelegate,其中5是任意整数,读取,扫描正好5个字符

以下是代码的修改版本

"%5c"

现在没有阻止。