我'已插入以下程序的以下输入:
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;
}
答案 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"
现在没有阻止。