c語言中的scanf 函式的用法

時間 2021-05-05 16:38:56

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...