1樓:次次次蛋黃公尺亞
1、用法:int scanf(char *format[,argument,...]);
scanf()函式是通用終端格式化輸入函式,它從標準輸入裝置(鍵盤) 讀取輸入的資訊。可以讀入任何固有型別的資料並自動把數值變換成適當的機內格式。
2、其呼叫格式為:
scanf("《格式化字串》",《位址表》);
scanf()函式返回成功賦值的資料項數,出錯時則返回eof。
3、scanf()函式的控制串的使用:
#include "stdio.h"
int main(void)
2樓:兔丞飛
輸出的值只是空格前面的字元是因為scanf函式的輸入格式錯誤,輸入引數的變數前需要加&。
scanf("%s",s);改為scanf("%s",&s);
scanf的用法是:scanf("格式控制字串",輸入引數一,輸入引數二);
格式控制字串包含:格式控制說明,普通字元。
1、格式控制字串表示輸入的格式,(int型用%d,float用%f,double型用%lf)
2、普通字元:在輸出資料的時候,按照原樣輸出的字元,如:"fahr=%d,celsius=%d\n"中的fahr=,celsius=。
3、輸入的引數是變數的位址,所以要在變數前面加&。
擴充套件資料
「輸出控制符」和「輸出引數」無論在「順序上」還是在「個數上」一定要一一對應。這句話同樣對 scanf 有效,即「輸入控制符」和「輸入引數」無論在「順序上」還是在「個數上」一定要一一對應。比如:
# include
int main(void)
3樓:小肥肥
首先需要#include int scanf( const char *format, ... );scanf()函式是格式化輸入函式,它從標準輸入裝置(鍵盤) 讀取輸入的資訊。
第乙個引數format為乙個常量字串,這個字串中如果包含『%』符號則使用後續引數進行匹配
如:scanf("%d%d", &a, &b)。
擴充套件資料:
1、格式指令說明
format指向的字串包含的格式指令由以下字串行組成:*,表示讀入的資料將被捨棄。帶有*的格式指令不對應可變引數列表中的任何資料。
2、域寬
以乙個非零的十進位制整數形式出現。表示該格式指令最多讀入的字元數。
3、格式說明符
c 讀入域寬指定的數目個字元組成的字串行(後面不會加上空位元組),如果省略寬度則讀入單字元。如%c或%1c讀入單字元,%2c讀入兩個字元(後面不會加上空位元組),以此類推。
s讀入乙個的字串行,後面會加上空位元組。
d,u讀入可選有符號(可選有符號表示輸入時可以帶符號也可以不帶符號,不帶符號則視為非負)十進位制整數。輸入格式應該像strtol函式的base實參為10呼叫時識別的字串行一樣。
i 讀入可選有符號整數。輸入格式應該像strtol函式的base實參為0呼叫時識別的字串行一樣。
a,e,f,g,a,e,f,g 讀入可選有符號浮點數,輸入格式應該像strtod函式識別的字串行一樣。
o讀入可選有符號八進位制整數。輸入格式應該像strtoul函式的base實參為8呼叫時識別的字串行一樣。
x,x讀入可選有符號十六進製制整數。輸入格式應該像strtoul函式的base實參為16呼叫時識別的字串行一樣。
p讀入乙個指標值。讀入的字串行應該與fprintf的%p產生的字串行形式相同。
n不讀入任何字元,而是把到該位置已讀入的字元數儲存到與之對應的int*指向的位置。本轉換說明符如果帶有*或者帶有域寬資訊(如:%*n或%3n等),則後果是未定義的。
4樓:如此_青春
scanf 函式最主要的用法是:
scanf("輸入控制符", 輸入引數);
用scanf()函式以%s格式讀入的資料不能含有空白符時,所有空白符都被當做資料結束的標誌。所以題中函式輸出的值只有空格前面的部分。
如果想要輸出包括空格在內的所有資料,可以使用gets()函式讀入資料。gets()函式的功能是讀取字串,並存放在指定的字元陣列中,遇到換行符或檔案結束標誌時結束讀入。換行符不作為讀取串的內容,讀取的換行符被轉換為字串結束標誌'\0'。
擴充套件資料:
使用scanf()函式需要注意的問題:
1.對於字串陣列或字串指標變數,由於陣列名可以轉換為陣列和指標變數名本身就是位址,因此使用scanf()函式時,不需要在它們前面加上"&"操作符。
2.可以在格式化字串中的"%"各格式化規定符之間加入乙個整數,表示任何讀操作中的最大位數。
3.scanf函式中沒有類似printf的精度控制。
如:scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。
4.scanf中要求給出變數位址,如給出變數名則會出錯
如:scanf("%d",a);是非法的,應改為scanf("%d",&a);才是合法的。
5.在輸入多個數值資料時,若格式控制串中沒有非格式字元作輸入資料之間的間隔,則可用空格,tab或回車作間隔。
c編譯在碰到空格,tab,回車或非法資料(如對「%d」輸入「12a」時,a即為非法資料)時即認為該資料結束。
6.在輸入字元資料(%c)時,若格式控制串中無非格式字元,則認為所有輸入的字元均為有效字元。
5樓:星座
scanf 後面的引數,就是要 寫變數的 位址。所以 int a,b; 就要 用 &a,&b 形式來呼叫 scanf.可是,如果是字串,char s[10]; scanf("%s",s); 引數 s 就 不要 &.
因為 s 就是 位址形式。scanf("%d,%d", &a, &b); 還有,你這句輸入時,a b 資料之間還要加逗號。例如 12,34
因為格式裡有逗號。
擴充套件資料:
注意問題
(1)在高版本的 visual studio 編譯器中,scanf 被認為是不安全的,被棄用,應當使用scanf_s代替 scanf。
(2) 對於字串陣列或字串指標變數,由於陣列名可以轉換為陣列和指標變數名本身就是位址,因此使用scanf()函式時,不需要在它們前面加上"&"操作符。
(3) 可以在格式化字串中的"%"各格式化規定符之間加入乙個整數,表示任何讀操作中的最大位數。
(4) scanf函式中沒有類似printf的精度控制。
如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。
(5) scanf中要求給出變數位址,如給出變數名則會出錯
如 scanf("%d",a);是非法的,應改為scanf("%d",&a);才是合法的。
(6) 在輸入多個數值資料時,若格式控制串中沒有非格式字元作輸入資料之間的間隔,則可用空格,tab或回車作間隔。
c編譯在碰到空格,tab,回車或非法資料(如對「%d」輸入「12a」時,a即為非法資料)時即認為該資料結束。
(7) 在輸入字元資料(%c)時,若格式控制串中無非格式字元,則認為所有輸入的字元均為有效字元。
6樓:魚與鹹魚
1、空白符問題
#include
main()
2、回車符也佔位。
#include
main()
3、scanf()函式的引數輸入型別不匹配問題#include
main()
7樓:_鈊_煩_薏亂
scanf函式稱為格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。
1. scanf函式的一般形式
scanf函式是乙個標準庫函式,它的函式原型在標頭檔案「stdio.h」中,與printf函式相同,c語言也允許在使用scanf函式之前不必包含stdio.h檔案。
scanf函式的一般形式為:
scanf(「格式控制字串」,位址表列);
其中,格式控制字串的作用與printf函式相同,但不能顯示非格式字串,也就是不能顯示提示字串。位址表列中給出各變數的位址。位址是由位址運算子「&」後跟變數名組成的。
例如:&a, &b
分別表示變數a和變數b 的位址。
這個位址就是編譯系統在記憶體中給a,b變數分配的位址。在c語言中,使用了位址這個概念,這是與其它語言不同的。 應該把變數的值和變數的位址這兩個不同的概念區別開來。
變數的位址是c編譯系統分配的,使用者不必關心具體的位址是多少。
變數的位址和變數值的關係如下:
在賦值表示式中給變數賦值,如:
a=567
則,a為變數名,567是變數的值,&a是變數a的位址。
但在賦值號左邊是變數名,不能寫位址,而scanf函式在本質上也是給變數賦值,但要求寫變數的位址,如&a。 這兩者在形式上是不同的。&是乙個取位址運算子,&a是乙個表示式,其功能是求變數的位址。
main()
在本例中,由於scanf函式本身不能顯示提示串,故先用printf語句在螢幕上輸出提示,請使用者輸入a、b、c的值。執行scanf語句,則退出tc螢幕進入使用者螢幕等待使用者輸入。使用者輸入7 8 9後按下回車鍵,此時,系統又將返回tc螢幕。
在scanf語句的格式串中由於沒有非格式字元在「%d%d%d」之間作輸入時的間隔,因此在輸入時要用乙個以上的
空格或回車鍵作為每兩個輸入數之間的間隔。如:
7 8 9或7
892. 格式字串
格式字串的一般形式為:
%[*][輸入資料寬度][長度]型別
其中有方括號的項為任選項。各項的意義如下:
1) 型別:表示輸入資料的型別,其格式符和意義如下表所示。
格式字元意義
d輸入十進位制整數
o輸入八進位制整數
x輸入十六進製制整數
u輸入無符號十進位制整數
f或e輸入實型數(用小數形式或指數形式)
c輸入單個字元
s輸入字串
2) 「*」符:用以表示該輸入項,讀入後不賦予相應的變數,即跳過該輸入值。
如:scanf("%d %*d %d",&a,&b);
當輸入為:1 2 3時,把1賦予a,2被跳過,3賦予b。
3) 寬度:用十進位制整數指定輸入的寬度(即字元數)。
例如:scanf("%5d",&a);
輸入:12345678
只把12345賦予變數a,其餘部分被截去。
又如:scanf("%4d%4d",&a,&b);
輸入:12345678
將把1234賦予a,而把5678賦予b。
4) 長度:長度格式符為l和h,l表示輸入長整型資料(如%ld) 和雙精度浮點數(如%lf)。h表示輸入短整型資料。
使用scanf函式還必須注意以下幾點:
1) scanf函式中沒有精度控制,如:scanf("%5.2f",&a);是非法的。不能企圖用此語句輸入小數為2位的實數。
2) scanf中要求給出變數位址,如給出變數名則會出錯。如 scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。
3) 在輸入多個數值資料時,若格式控制串中沒有非格式字元作輸入資料之間的間隔則可用空格,tab或回車作間隔。c編譯在碰到空格,tab,回車或非法資料(如對「%d」輸入「12a」時,a即為非法資料)時即認為該資料結束。
4) 在輸入字元資料時,若格式控制串中無非格式字元,則認為所有輸入的字元均為有效字元。
例如:scanf("%c%c%c",&a,&b,&c);
輸入為:
d e f
則把'd'賦予a, ' ' 賦予b,'e'賦予c。
只有當輸入為:
def時,才能把'd'賦於a,'e'賦予b,'f'賦予c。
如果在格式控制中加入空格作為間隔,
如:scanf ("%c %c %c",&a,&b,&c);
則輸入時各資料之間可加空格。
【例4.8】
main()
由於scanf函式"%c%c"中沒有空格,輸入m n,結果輸出只有m。而輸入改為mn時則可輸出mn兩字元。
【例4.9】
main()
本例表示scanf格式控制串"%c %c"之間有空格時,輸入的資料之間可以有空格間隔。
5) 如果格式控制串中有非格式字元則輸入時也要輸入該非格式字元。
例如:scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符「 , 」作間隔符,故輸入時應為:
5,6,7
又如
則輸入應為:
a=5,b=6,c=7
6) 如輸入的資料與輸出的型別不一致時,雖然編譯能夠通過,但結果將不正確。
main()
由於輸入資料型別為整型,而輸出語句的格式串中說明為長整型,因此輸出結果和輸入資料不符。如改動程式如下:
【例4.11】
main()
執行結果為:
input a long integer
1234567890
1234567890
當輸入資料改為長整型後,輸入輸出資料相等。
c語言中函式指標用法,C語言中函式指標用法
函式在記憶體中有一個物理位置,而這個位置是可以賦給一個指標的。一零點函式的地址就是該函式的入口點。因此,函式指標可被用來呼叫一個函式。函式的地址是用不帶任何括號或引數的函式名來得到的。這很類似於陣列地址的得到方法,即,在只有陣列名而無下標是就得到陣列地址。怎樣說明一個函式指標變數呢 為了說明一個變數...
c語言中gets函式和是scanf函式有什麼區別呢
一 指代不同 1 scanf 是c語言中的一個輸入函式。2 gets 從標準輸入裝置讀字串函式。二 讀取方式不同 1 scanf 是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。2 gets 可以無限讀取,不會判斷上限,以回車結束讀取,所以程式設計師應該確保buffer的空間...
c語言中char的用法,C語言中char的用法
會飛的小兔子 include intmain inti charc 定義乙個char型別的變數。c a 賦值 for i 0 i 26 i printf c c 輸出乙個字元用 c,c charc增加1,依次可以得到 abcdef。zprintf n if c z printf stillasmal...