2016-03-02 95 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將完成閱讀輸入。然而,由於你有一個循環,它會繼續閱讀輸入,直到你輸入「*」。