scanf函數(shù)中常用的格式字符含義 c語言必背函數(shù)?
c語言必背函數(shù)?格式的輸入功能2、printf格式輸出功能命令功能4.排序排序5.主要功能6.fgets文件讀取字符串函數(shù)7、fputs文件寫字符串功能8.fscanf文件格式讀取功能9.fprint
c語言必背函數(shù)?
格式的輸入功能
2、printf格式輸出功能
命令功能
4.排序排序
5.主要功能
6.fgets文件讀取字符串函數(shù)
7、fputs文件寫字符串功能
8.fscanf文件格式讀取功能
9.fprintf文件格式寫函數(shù)
10、fopen打開文件功能
11、getchar輸入字符功能
12、putchar輸出字符功能
動態(tài)申請記憶功能
14、自由釋放記憶功能
15、abs絕對值數(shù)學(xué)函數(shù)
16、sqrt平方根數(shù)學(xué)函數(shù)
為什么scanf輸入字符輸出換行符?
你不 我不明白scanf()函數(shù)的格式。scanf(";%d
In ",a),中的是輸入格式,即您輸入的內(nèi)容符合中指定的格式。至于%d,因為是轉(zhuǎn)義字符,所以會被后面的A代替,所以你要輸入成A。
我不 我不知道你是否能理解這個。
scanf與getchar的區(qū)別?
scanf和getchar的區(qū)別:
第一,函數(shù)格式不同。scanf函數(shù)是一個格式輸入函數(shù),即根據(jù)用戶指定的格式將數(shù)據(jù)從鍵盤輸入到指定的變量中。Getchar函數(shù)是一個鍵盤輸入函數(shù),它的作用是從鍵盤輸入一個字符。
第二,閱讀不同。scanf函數(shù)在讀取數(shù)字時會跳過空格、制表符和換行符。getchar函數(shù)只能輸入字符,遇到回車鍵就依次從緩沖區(qū)中提取字符。
第三,結(jié)束輸入的不同。scanf函數(shù)以空格、Enter和Tab結(jié)束輸入,不接受空格。getchar函數(shù)以Enter結(jié)束輸入(空格不 t結(jié)尾)并接受空格。
第四,丟棄回車的方法不同。scanf函數(shù)以空格、Enter和Tab結(jié)束輸入,最后一個回車不會被丟棄(也就是說,回車將保留在緩沖區(qū)中)。當(dāng)getchar函數(shù)以
scanf使用前怎么定義?
Scanf函數(shù)和printf函數(shù)一樣,都是在stdio.h中定義的,所以使用scanf函數(shù)時要加上#include。它是一個格式輸入函數(shù),即數(shù)據(jù)按照用戶指定的格式從鍵盤輸入到指定的變量,其關(guān)鍵字的最后一個字母f表示 "格式 "。[編輯本段]scanf函數(shù)的一般形式scanf(格式控制,地址表列)
int scanf(char *format[,參數(shù),...])
的含義格式控制 "同printf函數(shù); "地址表列 "是由幾個地址組成的表列,可以是變量的地址,也可以是字符串的第一個地址。
scanf()函數(shù)返回成功分配的數(shù)據(jù)項的數(shù)量,當(dāng)有錯誤時返回EOF。
示例:使用scanf函數(shù)輸入數(shù)據(jù)。
#包括
void main()
{
int a,b,c
printf(# 34輸入a,b,c
#34)
掃描f(#34%d%d%d#34,a,b,c)
printf(#34a%d,b%d,c%d#34,a,b,c)
}[編輯此段落]格式字符描述%a,%A讀取浮點值(僅對C99有效)
%c讀取一個字符。
%d讀取十進(jìn)制整數(shù)
%i讀取十進(jìn)制、八進(jìn)制和十六進(jìn)制整數(shù)。
%o讀取八進(jìn)制整數(shù)
%x,%X讀取十六進(jìn)制整數(shù)。
%c讀取一個字符。
%s讀取字符串,并以空格、制表符或換行符結(jié)束。
%f,%F,%e,%E,%g,%G用于輸入實數(shù),可以十進(jìn)制或指數(shù)形式輸入。
%p讀取指針。
%u讀取一個無符號十進(jìn)制整數(shù)。
% n相當(dāng)于目前讀取的值的字符數(shù)。
% []掃描字符集
%% Read%符號
附加格式描述字符表修飾符描述
L/l長度修改輸入#34 Long #34數(shù)據(jù)
h長度修改器輸入#34短#34數(shù)據(jù)
w整數(shù)常量指定輸入數(shù)據(jù)的寬度。
*表示在[編輯本段]中讀入后,該輸入項沒有賦給相應(yīng)的變量。]scanf的返回值由以下參數(shù)決定。
掃描f(#34%d%d#34,a,b)
如果A和B都成功讀入,scanf的返回值是2。
如果只有一個成功讀取,則返回值為1。
如果A和B沒有被成功讀取,返回值為0。
如果遇到錯誤或遇到文件結(jié)尾,返回值是EOF。
返回值是int類型?!揪庉嫳径巍渴褂胹canf功能時應(yīng)注意的問題1。sacnf()中的變量必須使用地址。
()的格式控制字符串可以使用其他非空白字符,但這些字符必須在輸入時輸入。
3.當(dāng)用#34%c#34輸入時,空格和 "轉(zhuǎn)義字符和都是有效字符。
問題scanf()函數(shù)不能正確接受帶空格的字符串?比如:我愛你!
#包括
int main()
{字符串[80]
掃描f(#34%s#34,str)
printf(#34%s#34,str)
返回0
}
輸入:我愛你!
輸出:當(dāng)scanf()函數(shù)接收到輸入數(shù)據(jù)時,在以下情況下結(jié)束a數(shù)據(jù)的輸入:(不是結(jié)束scanf函數(shù),而是scanf函數(shù)只在每個數(shù)據(jù)域有數(shù)據(jù),按Enter后結(jié)束)。
①在空間的情況下, "輸入 "和 "跳過 "鑰匙。
(2)寬度結(jié)束時。
③非法輸入的情況。
因此,上述程序可以 沒有達(dá)到預(yù)期的目的。scanf()在掃描#34I#34后面的空格時,認(rèn)為str的賦值已經(jīng)結(jié)束,忽略了下面的#34love you!#34.注意這里是# 34愛你!#34還在鍵盤緩沖區(qū)里(我在網(wǎng)上看到的也是一樣,但是調(diào)試后發(fā)現(xiàn)緩沖字符串的首末指針此時其實是相等的,也就是說緩沖區(qū)是空的,scan()函數(shù)應(yīng)該只是掃描stdin流,這個殘留信息在stdin里)。讓 讓我們修改上面的程序來驗證它:
#包括
int main()
{
字符串[80]
字符str1[80]
char str2[80]
Scanf(#34%s#34,str)/* :I在這里愛你!*/
printf(#34%s#34,str)
Sleep(5)/*在這里等5秒,告訴你程序在哪里運行*/
Scanf(#34%s#34,str 1)/* You don ;t不需要再輸入這兩句話,就是再掃描一遍鍵盤緩沖區(qū)*/
Scanf(#34%s#34,str 2)/* You don ;t不需要再輸入這兩句話,就是再掃描一遍鍵盤緩沖區(qū)*/
printf(#34
%s#34,str1)
printf(#34
%s#34,str2)
返回0
}
輸入:我愛你!
輸出:
我
愛
你!
好了,原因已知,那么scanf()函數(shù)能完成這個任務(wù)嗎?答案是:有!唐 不要忘記scanf()函數(shù)也有一個% []格式控制器(如果您不知道的話。;不了解% [],請看本文第一部分)。請參見以下程序:
#include #34stdio.h#34
int main()
{
char string[50]/*scanf(#34%s#34字符串)不能接收空格字符*/
scanf(#34%[^
]#34,字符串)
printf(#34%s
#34,字符串)
返回0
}
問題二:鍵盤緩沖區(qū)殘留信息的問題。
#包括
int main()
{
int a
char c do
{
掃描f(#34%d#34,a)
掃描f(#34%c#34,c)
printf(#34a%d c%c
#34,a,c)/*printf(#34c%d
#34,c)*/
}while(c!#39N#39)
}
語句scanf(#34%c#34,c)無常接收字符。原因是什么?我們使用printf(#34c%d
#34,c)用int表示c,并啟用printf(#34c%d
#34,c)這句話,看看scanf()函數(shù)給c賦值什么,結(jié)果是C10。10的ASCII值是多少?換行符
順便說一下,每次我們按下#34Enter#34鍵,我們就發(fā)送一個 "輸入 "到鍵盤緩沖區(qū)(
),a "換行#34(
),在這里
被scanf()函數(shù)釋放(let 就是這么想的_),而且
它被scanf()函數(shù)錯誤地分配給了c。解決方法:可以在兩個scanf()函數(shù)后面加fflush(stdin),也可以加getch()和getchar(),不過要看具體的scanf()語句,所以我贏了 這里就不分析了。讓讀者自己去探索。但是添加fflush(stdin)在任何情況下都是可行的。
(
函數(shù)名:·弗盧斯
工作能量:清理一條溪流。
: int模糊(文件*流)
)
#包括
int main()
{
int a
char c do
{
掃描f(#34%d#34,a)
fflush(標(biāo)準(zhǔn)輸入)
掃描f(#34%c#34,c)
fflush(標(biāo)準(zhǔn)輸入)
printf(#34a%d c%c
#34,a,c) }while(c!#39N#39)
}
這是另一個使用 "空格字符和處理緩沖區(qū)中的剩余信息;運行錯誤的程序;
#包括
int main()
{
我nt i
char j
對于(0i lt 10i)
{
Scanf(#34%c#34,j)/*此處%之前沒有空格*/
}
}
使用空格控制字符后:
#包括
int main()
{
int i
char j
對于(0i lt 10i)
{
Scanf(#34 %c#34,j)/*注意這里的%之前有一個空格*/
}
}
您可以運行它來查看兩個程序之間的差異。
問題3:如何處理scanf()函數(shù)輸入錯誤導(dǎo)致的程序死鎖或錯誤?
#包括
int main()
{
Int a,b,c /*計算a b*/
掃描f(#34%d,%d#34,a,b)
ca b
printf(#34%d %d%d#34,a,b,c)
}
和上面的程序一樣,如果A和B的值輸入正確,就沒有問題。然而,你可以 我不能保證用戶每次都能正確輸入。一旦輸入了錯誤的類型,你的程序要么被死鎖,要么得到錯誤的結(jié)果。呵呵,這可能是大家都遇到過的問題。解決方案:成功執(zhí)行scanf()函數(shù)時,返回值是成功讀取的變量個數(shù)。也就是說,你的scanf()函數(shù)有幾個變量。如果正常讀取所有scanf()函數(shù),它將返回幾個變量。但是,這里要注意另一個問題。如果輸入非法數(shù)據(jù),可能會出現(xiàn)鍵盤緩沖區(qū)殘留信息的問題。正確的程序:
#包括
int main()
{
Int a,b,c /*計算a b*/
while(scanf(#34%d,%d#34,a,b)!2)fflush(標(biāo)準(zhǔn)輸入)
ca b
printf(#34%d %d%d#34,a,b,c)
}
補充:fflush(stdin)在GCC下不可用。(在VC6.0下)
以下是fflush函數(shù)在C99中的定義:
文件*流
如果流指向輸出流或更新流,并且該更新流
最近的操作沒有輸入,所以fflush函數(shù)會將任何未寫入的數(shù)據(jù)寫入流中。
指向文件(如標(biāo)準(zhǔn)輸出文件stdout)。否則,fflush函數(shù)的行為是不確定的。
Fflush(NULL)清空所有輸出流和上面提到的更新流。如果發(fā)生寫入錯誤,fflush
函數(shù)將標(biāo)記那些有錯誤的流并返回EOF,否則將返回0。
因此,如果流指向輸入流(比如stdin),fflush函數(shù)的行為是不確定的。所以使用
Fflush(stdin)不正確,至少不便攜。
可以采用以下方法:
Void flush() /*只適用于鍵盤緩沖區(qū)有殘留信息的情況。如果鍵盤緩沖區(qū)為空,請按星號/
{
while (getchar()!#39
#39)
}
#包括
int main()
{
Int a,b,c /*計算a b*/
while(scanf(#34%d,%d#34,a,b)!2)齊平()
ca b
printf(#34%d %d%d#34,a,b,c)
}