解決scanf獲取輸入資料時,遇到空格結束的問題

2021-10-02 21:00:23 字數 1488 閱讀 3143

先簡單了解一下scanf函式:

函式原型:int

scanf

(const

char

*format,..

.);

#include

intmain

(int argc,

const

char

**ar**)

以上**

如果輸入:4 5,則輸出結果為:i = 2

如果輸入:4 k,則輸出結果為:i = 1

因為a和b都是整型資料,輸入的k為字元,故正確接收到的變數就只有a,所有才輸出 i = 1

回歸正題,請看以下**

#include

intmain

(int argc,

const

char

**ar**)

;printf

("輸入一串字元:");

scanf

("%s"

,buf)

;printf

("buf = %s\n"

,buf)

;}

如果輸入字串為:abcd ,返回的結果無疑是:buf = abcd

那如果輸入字串:a b c d 呢,返回的結果則為:buf = a

這是因為:

scanf的讀取原理是匹配字元,當scanf從緩衝區讀取資料時遇到空格和回車鍵則會認為讀取完畢

因此有以下幾種方式解決

(1)使用gets(buf); 替換scanf("%s",buf);即可,但是編譯時系統會報警告,說它不安全,因為gets()不能指定獲取資料的長度,故可使用fgets()

(2)使用fgets(buf,20,stdin); 替換scanf("%s",buf);即可

函式原型:char

*fgets

(char

*s,int size, file *stream)

;引數說明:

char

*s :儲存讀到的資料的首位址,這裡是buf

int size:儲存空間的大小,這裡是20

file *stream:讀的目標檔案的檔案流,這裡是stdin

返回值:

成功返回乙個指標,指向字串中第乙個字元的位址

失敗/讀到末尾,返回null

(3)使用scanf("%[^\n]",buf); 替換scanf("%s",buf);即可

這是從一些大牛們的部落格找到的方法,一開始並不理解為什麼這樣就可以,後來找到在這篇部落格有說到

總結為:[^\n]的意思是scanf遇到\n才停止讀取,需注意的是,使用

scanf("%[^\n]",buf)後,buf中存放的字串末尾是沒有『\n』的。

要想知道更多關於scanf的用法和注意事項可以看看:

scanf遇空格後繼續輸入

如何讓scanf 函式正確接受有空格的字串?如 i love you include int main 輸入 i love you 上述程式並不能達到預期目的,scanf 掃瞄到 i 後面的空格就認為對str的賦值結束,並忽略後面的 love you 這裡要注意是 love you 還在鍵盤緩衝區 ...

scanf的輸入字元時的陷阱

這個例子證明了 scanf c ch 等價於ch getchar 在用 c的時候要格外小心 int型 正確 include int main return 0 char型 錯誤 include int main return 0 有空格時的執行結果 a bvar1 97,var2 98 i 0 c ...

連續scanf輸入字元型資料時,出現跳過輸入問題

例 include main 通過新增fflush stdin 來清空鍵盤緩衝區。include main 或者通過新增getchar 來臨時接收回車enter include main 總結 sacnf函式接收輸入資料時,遇見以下三種情況結束乙個資料當輸入 遇空格,回車,跳格鍵 遇寬度格式修飾符 ...