關於c語言scanf()函式用法

2021-12-27 18:29:21 字數 5898 閱讀 7347

1樓:匿名使用者

scanf是c語言中的一個輸入函式,與printf函式一樣,都被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上#include 。(在有一些實現中,printf函式與scanf函式在使用時可以不使用預編譯命令#include 。

)它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf函式返回成功讀入的資料項數,讀入資料時遇到了「檔案結束」則返回eof。

2樓:匿名使用者

char c;int a,b;

scanf("%c %d %d",&c,&a,&b);//不明白你是如何輸入的,這句話是正確的,能正確輸入

char s[2];int a,b;

輸入字串的時候以空格為分隔符,不接受空格

3樓:金色潛鳥

char c;int a,b;

scanf("%c %d %d",&c,&a,&b);

輸入 加號[空格]1[空格]2[回車] ,應能正確裝進變數c、a、b中。

如果 前面加了空格或回車之類,c 會吃進 空格或回車之類 的鍵,導致 錯誤。

如果你想讓 c 讀得 非空白的字元, 並讓輸入 有靈活性,可以用:

char c;int a,b;

格式 %c 前面添一個空格

printf("%c %d %d\n",c,a,b);

這樣,無論你拍入

+ 1 2

或拍入回車+ 1 2

或回車空格 + 1 2

空格空格+ 1 2

**鍵 + 1 2

等等,你都能得到 + 1 2 的結果。

*****==

同樣 在第一個格式"%c" 前添一個空格 " %c":

scanf(" %c",&t);//②,後來加上你的輸入就有靈活性。

*****==

想有意識地讀一個空白字元,直接用 getchar()想有意識地讀一行混有空白字元的字串,用 gets()

4樓:

新手使用scanf確實很容易在一些隱蔽的地方觸礁。常見的scanf規則:

1、格式與型別的對應:最常見的問題是,double型別對應的格式符是%lf,而%f是對應float的,這點與printf不同,不可弄錯。

2、大多格式符自身都是不接受空格、列表符、換行等等空白的,會自動忽略前導的空白。唯獨%c是不忽略空白的,可以用來獲取空白符輸入的。

不管是在格式串裡還是在輸入裡,任何一個或多個連續的空白都視為分隔,除非格式串裡對應位置是%c格式符。因此用%s格式符無法獲取含有空白符的字串輸入。反過來如果在格式串裡%c的前面加個空格,那這個空格會幫%c先過濾掉可能存在其前頭的一段空白,這是一個技巧。

3、格式符的個數與引數的數量不對應。引數給多了沒取得輸入值,給少了更糟。

4、scanf是格式化輸入,它要求除了空白以外,任何輸入必須與格式串一一對應。也就是說如果格式串裡面有個逗號,那麼在輸入的對應位置那裡就要輸入個逗號,否則就算輸入錯誤(非法字元)。

5、如果一次scanf輸入中有多個輸入的,只要有一個非法字元(輸入格式與需要的不匹配)或其他錯誤,那麼排後面都獲取不到輸入值,非法字元與後面的字元還滯留在輸入流中,等待下次讀入。

6、scanf一類標準庫函式面向的是流,流是連續的。在一行中輸入了過多的東西,會滯留在輸入流中,被下次讀入時獲取。因此有時需要自己略過(跳過)一些沒用內容或者清空輸入流。

理解流的含義,所有的輸入都是按順序排好隊的,讀取流的時候也是按順序一個一個字元讀的,不可能跳過前面的字元而讀到後面的字元;一個字元被讀取了,它就從流裡消失了,下一個字元成為流的開頭。

因此lz所說的輸入之間的空白,準確的說是對每個格式符而言,他能忽略的是存在其前面的空白。

lz所說的最後一個回車符其實不是被自動扔掉,而是還留在輸入流裡,只是還沒有相關的輸入函式被呼叫而去讀入它。

scanf的使用還有一些技巧:

1、建議:在所有非特定需要空白符的輸入時,在格式符%c前面加個空格。

2、scanf有返回值,是成功輸入的變數的個數,可以用來檢查輸入是否成功等情況。

3、帶數字的%c格式符,比如"%8c"可以用來獲取有固定長度的含空格等的字元輸入,用來填充字元陣列。%c和%s的區別是%c不區分空白,以及不會在末尾自動新增'\0'。

4、帶星號的格式符,比如%*d,可以用來略過(跳過)一些對應格式的輸入。比如%*11c跳過包括空白在內11個字元。帶星號的格式符不佔用scanf引數的個數。

關於c語言scanf的用法

5樓:匿名使用者

其實這個問題很有意思,為什麼非要傳變數的地址而不是直接傳變數呢?

僅僅說是規定不能讓人信服。我們假設scanf函式可以這樣給i賦值:

scanf("%d", i);而不是scanf("%d", &i);

有的人可以說我可以在scanf函式內在取i的地址賦值啊,不也行嗎?

其實問題就出在這兒,因為c語言是傳值的,那麼scanf函式內部是不能取得實參i的地址的,取得的是形參的地址而已,那麼賦值的時候是給形參賦值了,i並沒有改變。

即等價於一個形參temp,它是一個臨時變數,其值等於i,但&temp的值與&i的值不同。

所以給實參i賦值失敗。

您應該明白為什麼要傳地址了吧,而printf的時候又不要傳地址了。

6樓:匿名使用者

scanf的第二個引數被定義為一個指標(就是一個記憶體地址)&運算計算出i的記憶體地址,然後作為scanf的引數如果用i的話,就是把i的值當作記憶體地址作為scanf的引數顯然i=0x00000000,不是一個有效的記憶體地址(c語言保證0永遠不會是任何有效資料的地址)

函式scanf得不到正確的記憶體地址,難道你覺得它猜得出i的地址嗎

7樓:伊·梵

函式就是這樣設計的

因為c語言的函式都是傳值的,函式呼叫是不可能改變實參的值的int i;

foo(i);//這個是不可能改變i的值的i=foo(j);//重新賦值

foo(&i);//傳i的地址,可以改變i的值

8樓:愛問問

c語言規定怎樣了,沒辦法啊!

c語言中的scanf 函式的用法

9樓:次次次蛋黃米亞

1、用法:int scanf(char *format[,argument,...]);

scanf()函式是通用終端格式化輸入函式,它從標準輸入裝置(鍵盤) 讀取輸入的資訊。可以讀入任何固有型別的資料並自動把數值變換成適當的機內格式。

2、其呼叫格式為:

scanf("《格式化字串》",《地址表》);

scanf()函式返回成功賦值的資料項數,出錯時則返回eof。

3、scanf()函式的控制串的使用:

#include "stdio.h"

int main(void)

10樓:兔丞飛

輸出的值只是空格前面的字元是因為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)

11樓:小肥肥

首先需要#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等),則後果是未定義的。

12樓:如此_青春

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)時,若格式控制串中無非格式字元,則認為所有輸入的字元均為有效字元。

初學C語言,關於for迴圈中scanf函式應用的一點小疑問

你在輸入第二行按下回車之後,輸入的這行內容就被存在緩衝區裡,scanf就會按指內 定的容輸入格式來讀取這些資料,每遇到空白 回車或者tab就會認為那個資料結束,所以n次迴圈就會讀入n個資料,按上面的理解,如果你輸入的時候是輸入這種 988回車 74回車 這種也是可以的。c語言for迴圈裡的scanf...

c語言中scanf和printf函式的問題關於雙精度

其實嚴格來說 兩個是一樣的 輸入的時候要用 lf 輸出的時候也要用 lf 的 f能輸出double 我也不懂 哈哈 你就按照 double 對應 lf 理解就可以了能輸出不影響 lf 不能輸入輸出double的時候再問也不遲 lf長浮點型,f浮點型 1f 小數點後1位 如果是 輸出printf 的輸...

C語言shellexecute函式的用法

shellexecute的功能是執行一個外部程式 或者是開啟一個已註冊的檔案 開啟一個目錄 列印一個檔案等等 並對外部程式有一定的控制。有幾個api函式都可以實現這些功能,但是在大多數情況下shellexecute是更多的被使用的,同時它並不是太複雜。返回值 執行成功會返回應用程式控制代碼 返回的h...