c語言(scanf函式問題),c語言中scanf函式定義寬度的問題

2022-04-16 16:59:16 字數 5809 閱讀 6759

1樓:匿名使用者

搞不清楚你的問題是什麼意思,只能給你簡單的分析一下了scanf函式有輸入的功能,這是廢話了,一般來講我們輸入資料都有多個,很少會出現僅輸入一個的情況(多行輸入的情況除外)。既然我們要輸入多個,就必須要用某些符號將它們分隔開(如:空格是最常見的,還有就是逗號)。

如果沒有分隔開,scanf("%d%d",&a,&b);像這樣,那我們就算輸入再長的資料,也只會給第一個變數,為什麼?因為沒有分隔開程式不知道第一個資料到什麼地方結束,當然就一直給第一個資料賦值了。當有了分隔符,如:

scanf("%d %d",&a,&b);,那我們只要在第一個資料後面加一個空格,程式就知道了我們要給第二個變數賦值了。自然兩個變數都有自己的值了

再補充一下,遇到空格tab回車時資料結束僅僅是在給陣列賦值中。如果這幾個符號出現在了函式呼叫中,這就與陣列賦值沒多大關係了

2樓:聖雨澤後康

沒有變化,在執行輸入值的時候也跟其符號就可以了,換其它符號也要符合c語言無法規則。

3樓:不酴釄的山茶

你的輸入的格式要跟鍵盤輸入格式對應吧,就是改為scanf("%d %d",&a,&b);

4樓:南風丶破曉

你試試scanf_s

c語言中scanf函式定義寬度的問題

5樓:

scanf("%4d",&a);表示若輸入小於或等於四位,則原樣輸出,若輸入大於四位,從左到右擷取你輸入的字元

scanf("%-4d",&a);表示若輸入小於或等於四位,則原樣輸出,若輸入大於四位,從右到坐擷取你輸入的字元

6樓:_殘陽_古道

這個問題問的好。

你問題的第二種情況是說如果輸入多個字元型別資料的情況。

如果是這樣,請注意,除非,如果scanf後面的格式是%c的,那麼它只能吸收你輸入的一個字元,後面的東西全部放在快取區。也就是說,你再接上一個scanf( "%c", &c),它會繼續吸收你前面沒有吸收到的字元。

如果下面語句段:

scanf( "%c", ch1 );

scanf( "%c", ch2 );

scanf( "%c", ch3 );

你輸入"ab"後按回車。那麼,a被ch1吸收,b被ch2吸收,ch3呢?你是不是以為沒有東西吸收?其實你輸入ab後按了回車,所以回車被ch3吸收了。這點一定要小心。

你的問題第一種情況就明顯很多了。

比如你的scanf語句吸收格式欄位是%4f,但是你輸入了3.1415926那麼,它只會吸收3.14,作為浮點型別。後面的15926以整型的方式存在於快取中。

學c語言一定要不停的去體悟它的輸入輸出,個人覺得它的重要性僅次於指標。

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

7樓:匿名使用者

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

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

8樓:匿名使用者

char c;int a,b;

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

char s[2];int a,b;

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

9樓:

新手使用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 函式的用法

10樓:次次次蛋黃米亞

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

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

2、其呼叫格式為:

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

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

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

#include "stdio.h"

int main(void)

11樓:兔丞飛

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

12樓:小肥肥

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

13樓:如此_青春

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語言scanf 的問題,關於C語言scanf 的一個問題

回車 也是一個字元,編譯器把 回車 賦給了x。這也是使用字元特別之處要注意。另外編譯器有些智慧,先執行了scanf c x 再執行printf 請輸入x 而scanf c x 放在後面,回車 執行的是它原來特有的功能。在這個程式中的 printf 請輸入a scanf d a printf 請輸入x...

c語言,函式,函式,c語言,函式,函式模板

那是c 自帶的模板庫,c的很少,而且 長難記且功能少,基本可以忽略。要是用c的話,函式基本要自己寫的 在c語言中如何實現函式模板 各種用 c 語言實現的模板可能在使用形式上有所不同。現以一個求和函式 sum 為例,用 c template 可寫如下 template r sum const t ar...

為什麼c語言中不能用scanf函式反覆對同字元

int a scanf d a scanf d a scanf d a a是最後一次輸入的那個值 c語言中如何使輸出的字串佔8個字元 include int main 直接寫 printf 8s n 你的字串 就可以了 include stdio.h int fab int n char a 8 v...