scanf函式總結:注意事項及例程
scanf函式說明:
a. 如果使用這個函式,要包含一個頭檔案 stdio.h。
b.scanf函式是一個阻塞式函式:函式執行後,會等待使用者的輸入,如果使用者不輸入任何內容,它會一直等待。
scanf函式的作用:
接收使用者從鍵盤輸入的內容。
scanf函式的格式:
scanf("格式控制符",輸入項的地址列表);
例如:scanf("%d",&a); 其中a是一個變數
2>scanf函式使用注意事項
scanf使用注意事項
注意:1)如果在輸入時,輸入了多個空格、回車、Tab都會被系統忽略的。
2)如果要獲取的內容是多個整數,中間輸入了多個空格、回車、Tab都會被系統忽略
特別注意:當輸入是一個字串時,輸入字串時不能在中間輸入空格、回車、Tab,否則之後的字元都不會被輸入。
3>scanf函式執行原理:
1)當用戶輸入內容後,使用者輸入的內容會被存放到scanf的輸入緩衝區中,然後scanf函式會根據格式控制的字元的要求,從輸入緩衝區一次取它想要的內容,如果從緩衝區中取的內容和我們的格式要求一致,則把值存放到變數中如果格式不一致,則不修改變數的值。
2)如果緩衝區中有內容,則不會提示我們再輸入值。
4>關於scanf函式的總結:
a.如果我們的輸入全都是%d型別的,那麼無論我們在輸入資料時時插入 空格、回車、Tab等其他字元,都會被系統忽略。
b.如果我們輸入的是型別中含有%c型別等混合輸入,那麼就不能隨便的插入 空格、回車、Tab等其他字元,要按照scanf函式的格式來從鍵盤輸入。
例如:
scanf("%d%c%d",&a,&ch&b);
從鍵盤輸入的格式如下:
21a34(回車)
小結:所以一般在混合的scanf函式書寫時最好使用如下格式:這樣不僅安全而且我們輸入時也清楚明瞭。
建議格式:scanf("%d,%c,%d",&a,&ch,&b);
從鍵盤輸入的格式:21,a,34
總之在輸入時,一定按照scanf的“格式控制符”的格式一 一輸入。
示例如下:
實現功能:判斷字串中是否包含某個字元,如果包含,返回其首次出現的位置,否則返回-1
說明:為了使程式更加靈活改進如下:
1>讓使用者自己輸入 字串
2>讓使用者自己輸入要查詢 字元
例1
列印如下:
列印圖1
當找不到的列印如下
列印圖2
例2
列印如下:
列印圖3
注意:
例1和例2是同一個例題,但是打印出來卻是大不同,倆個程式的差別就是在scanf函式的格式不同
例1中的scanf形式為scanf("%s %c",str,&c)而例2中的scanf形式為scanf("%s,%c",str,&c)。scanf("%s,%c",str,&c)形式在上面是我們推薦使用的一個格式但是為什麼會出錯?這個問題就在於scanf("%s,%c",str,&c)中是%s而不是%d、%c
這是為什麼,我個人覺得因為是當輸入asdfg,f時,由於在scanf("%s,%c",str,&c)中第一個格式控制符是%s,是輸入字串的所以即使輸入中有’,‘但是依然會把’,‘看做是普通字元。
例1就是巧妙的應用了輸入字串時的特性(輸入字串時中間不能加 空格、回車、Tab,否則後面的字元無法輸入),所以在scanf("%s %c",str,&c)不是用逗號來隔開的而是用空格來隔開的。同樣你用Tab隔開%s和%c也是可以的。難道就不能用逗號?
使用逗號來隔開%s和%c的用法:
例3
列印如下:
>可以找到
列印圖4
>找不到
列印圖5
>輸入格式有誤
列印圖6
總結:通過對比例2和例3發下,例3使用逗號來隔開%c,%s,scanf("%c,%s",&c,str)可以完成程式要求,例3的成功是因為%c和%s交換了位置。這樣為什麼可以?
分析:當我們輸入a,kjgsdfa時,a儲存到了字元區,kjgsdfa儲存到了字串區,所以這樣是可以的。
通過列印圖1和列印圖3比較可以知道,我們必須按照scanf("%c,%s",&c,str)的格式來輸入,是逗號就用逗號,是空格就用空格,這和我們前面的說明是一致的。當然scanf("%c,%s",&c,str)中的','也可以被空格、Tab代替來使用。
建議:當用scanf函式有%c,%d,%s混合的輸入時,推薦使用此格式:scanf("%d,%c,%s",&a,&ch,str);