2016-03-02 62 views
-1

我有以下代码。我以为我一次只能输入一个字符。但即使我在一行中输入喜欢的字符串作为输入,它也能正确接受。为什么是这样?它与标准输入缓冲区冲刷问题有关吗?当指定的格式是字符时接受字符串

#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

“如果我给一个字符串像hello作为一行输入,它会正确接受” - >这与你所期望的不同吗? – chux

回答

1

当你输入一个字符串按ENTER键,整个字符串进入输入缓冲区stdin

接着,作为每%c格式指定符的属性,如在标准C11,章节§7.21.6.2提到的,fscanf()

精确匹配由字段中指定的数目的字符序列 宽度(如果指令中没有字段宽度,则为1)。

它将匹配(并扫描并存储)第一个条目(char)到缓冲区中,其余缓冲区内容保持不变。

当您在循环中运行scanf()时,下一次调用将再次从输入缓冲区中读取(并且只要它们在stdin缓冲区中处于待处理状态,就继续)。

0

这里有什么问题?一次接受一个字符,不管有多少字符,并且将的一个字符放入数组中,直到满足条件为止。这只是一个(更复杂的)输入字符串(*)的方式,其行为类似于空终止符('\0')。

顺便说一句,你应该检查你的第一个循环的边界。添加类似这样的内容,或者当输入字符串大于100个字符时,程序将崩溃并出现段错误。

do { 
    // your code here 
} while ((sourceString[index-1]!='*') && (index < 100)); 
0

使用scanf时,您需要用空白字符(例如\ n)终止输入。当您输入换行符时,scanf将完成阅读输入。然而,由于你有一个循环,它会继续阅读输入,直到你输入“*”。