我有以下代码。我以为我一次只能输入一个字符。但即使我在一行中输入一个像hello这样的字符串作为输入,它也能正确接受。为什么是这样?它与标准输入缓冲区刷新问题有关吗?
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
int main()
{
char sourceString [100];
int index=0;
printf("Enter the characters one by one enter * to stop\n");
do
{
scanf("%c",&sourceString[index]);
index++;
} while (sourceString[index-1]!='*');
index=0;
while (sourceString[index]!='*')
{
printf("%c",sourceString[index]);
index++;
}
printf("\n");
return(0);
}
答案 0 :(得分:1)
当您输入字符串并按ENTER时,整个字符串将进入输入缓冲区stdin
。
接下来,根据%c
格式说明符的属性,如C11
标准中所述,章节§7.21.6.2, fscanf()
匹配字段指定的字符序列 width(如果指令中没有字段宽度,则为1)。
它将匹配(并扫描并存储)缓冲区中的第一个条目(char
),而其余的缓冲区内容保持不变。
当你在循环中运行scanf()
时,下一个调用将再次从输入缓冲区读取(并且只要它们在stdin
缓冲区中的内容未决,就继续)。
答案 1 :(得分:0)
这里有什么问题?它一次接受一个字符,无论有多少个字符,并且一次将一个字符放入数组,直到满足条件。这只是一种(更复杂的)输入带星号(*
)的字符串的方式,就像一个空终止符('\0'
)。
顺便说一下,你应该检查第一个循环中的边界。添加这样的东西,或者当输入字符串大于100个字符时,程序将崩溃并出现段错误。
do {
// your code here
} while ((sourceString[index-1]!='*') && (index < 100));
答案 2 :(得分:0)
使用scanf时,需要使用空白字符(例如\ n)终止输入。输入换行符时,scanf将完成读取输入。但是,由于你有一个循环,它将继续读取输入,直到你输入“*”。