先簡單了解一下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函式接收輸入資料時,遇見以下三種情況結束乙個資料當輸入 遇空格,回車,跳格鍵 遇寬度格式修飾符 ...