scanf函數輸入字串,C語言scanf函數輸入字串詳解

2020-07-16 10:04:20
除了在定義字元陣列時初始化外,還可以通過scanf從鍵盤輸入字串。下面寫一個程式:
# include <stdio.h>
int main(void)
{
    char str[10];  //str是string的縮寫, 即字串
    printf("請輸入字串:");
    scanf("%s", str);  /*輸入引數是已經定義好的“字元陣列名”, 不用加&, 因為在C語言中陣列名就代表該陣列的起始地址*/
    printf("輸出結果:%sn", str);
    return 0;
}
輸出結果是:
請輸入字串:愛你一生一世
輸出結果:愛你一生一世

用 scanf 給字元陣列賦值不同於對數值型陣列賦值。前面講過,給數值型陣列賦值時只能用 for 迴圈一個一個地賦值,不能整體賦值。而給字元陣列賦值時可以直接賦值,不需要使用迴圈。此外從鍵盤輸入後,系統會自動在最後新增結束標誌符 ''。但是用 scanf 輸入字串時有一個地方需要注意:如果輸入的字串中帶空格,比如“i love you”,那麼就會有一個問題。我們將上面程式執行時輸入的字串改一下:
# include <stdio.h>
int main(void)
{
    char str[10];  //str是string的縮寫, 即字串
    printf("請輸入字串:");
    scanf("%s", str);  //輸入引數是已經定義好的字元陣列名
    printf("輸出結果:%sn", str);
    return 0;
}
輸出結果是:
請輸入字串:i love you
輸出結果:i

我們看到,輸入的是“i love you”,而輸出的只有“i”。原因是系統將空格作為輸入字串之間的分隔符。也就是說,只要一“敲”空格,系統就認為當前的字串已經結束,接下來輸入的是下一個字串,所以只會將空格之前的字串儲存到定義好的字元陣列中。

那麼這種情況該怎麼辦?那麼就以空格為分隔符,數數有多少個字串,有多少個字串就定義多少個字元陣列。比如“i love you”有兩個空格,表示有三個字串,那麼就定義三個字元陣列:
# include <stdio.h>
int main(void)
{
    char str1[10], str2[10], str3[10];
    printf("請輸入字串:");
    scanf("%s%s%s", str1, str2, str3);
    printf("輸出結果:%s %s %sn", str1, str2, str3);  //%s間要加空格
    return 0;
}
輸出結果是:
請輸入字串:i love you
輸出結果:i love you

需要注意的是,前面講“清空緩衝區”的時候講過,用 scanf 輸入時,不管輸入什麼,最後“敲”的回車都會被留在緩衝區,這裡也不例外。輸入字串時最後“敲”的回車也會被留在緩衝區,如果緊接著要給一個字元變數賦值的話,那麼還沒等你輸入系統就自動退出來了。因為系統自動將回車產生的字元 'n' 賦給該字元變數了,所以此時對字元變數賦值前要首先清空緩衝區。