指定格式为字符时接受字符串

时间:2016-03-02 14:34:42

标签: c string char scanf

我有以下代码。我以为我一次只能输入一个字符。但即使我在一行中输入一个像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);
}

3 个答案:

答案 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将完成读取输入。但是,由于你有一个循环,它将继续读取输入,直到你输入“*”。