vs常量中有換行符怎么解決 scanf使用前怎么定義?
scanf使用前怎么定義?簡介scanf函數(shù),與sprintf函數(shù)一樣的,都被定義在stdio.h里,因此在可以使用scanf函數(shù)時要另外#include。它是格式鍵入函數(shù),即按用戶委托的格式從鍵盤上
scanf使用前怎么定義?
簡介scanf函數(shù),與sprintf函數(shù)一樣的,都被定義在stdio.h里,因此在可以使用scanf函數(shù)時要另外#include。它是格式鍵入函數(shù),即按用戶委托的格式從鍵盤上把數(shù)據(jù)輸入到重新指定的變量之中,其關鍵字最末一個字母f即為“格式”(format)之意。[編輯本段]sprintf函數(shù)的好象形式scanf(格式控制,地址表列)
intscanf(char*format[,argument,...])
“格式控制”的含義同sprintf函數(shù);“地址表列”是由若干個地址排成的表列,是可以是變量的地址,或字符串首地址。
scanf()函數(shù)返回最終定義變量的數(shù)據(jù)項數(shù),出錯時則返回EOF。
例:使用sscanf函數(shù)然后輸入數(shù)據(jù)。
#include
voidmain()
{
inta,b,c
printf(#34inputa,b,c
#34)
scanf(#34%d%d%d#34,a,b,c)
printf(#34a%d,b%d,c%d#34,a,b,c)
}[編輯本段]格式字符只能證明%a,%A輸入數(shù)據(jù)一個浮點值(僅C99快速有效)
%c數(shù)據(jù)讀入一個字符
%d輸入數(shù)據(jù)十進制整數(shù)
%i寫入到十進制,八進制,十六進制整數(shù)
%o讀入八進制整數(shù)
%x,%X讀入十六進制整數(shù)
%c讀取數(shù)據(jù)一個字符
%s數(shù)據(jù)讀入一個字符串,遇空格、制表符或換行符已經(jīng)結束。
%f,%F,%e,%E,%g,%G單獨鍵入實數(shù),可以不用小數(shù)形式或指數(shù)形式輸入。
%p數(shù)據(jù)讀入一個指針
%u讀取數(shù)據(jù)一個無符號十進制整數(shù)
%n至此已讀入值的等價字符數(shù)
%[]掃描字符子集
%%讀%符號
附加格式只能說明字符表修飾符那就證明
L/l長度修飾符輸入#34長#34數(shù)據(jù)
h長度修飾符輸入#34短#34數(shù)據(jù)
W整型常數(shù)指定你然后輸入數(shù)據(jù)所占寬度
*來表示本鍵入項在讀入后不賦值給相應的變量[編輯時本段]scanf的返回值scanf的返回值有后面的參數(shù)確定
scanf(#34%d%d#34,a,b)
如果a和b都被順利讀入,那就scanf的返回值就是2
如果只有一a被順利讀取數(shù)據(jù),返回值為1
如果沒有a和b都未被完成輸入數(shù)據(jù),返回值為0
如果遇到錯誤或遇到了endforfile,返回值為EOF。
且直接返回值為int型.[編輯的話本段]在用fprintf函數(shù)時應該注意的問題1、sacnf()中的變量可以使用地址。
2、scanf()的格式控制串可以可以使用其它非空白字符,但在輸入輸入時前提是輸入輸入這些字符。
3、在用#34%c#34鍵入時,空格和“轉義字符”均才是有效字符。
問題一:scanf()函數(shù)不能不能錯誤的認可有空格的字符串?如:I love you!
#include
intmain()
{
charstr[80]
scanf(#34%s#34,str)
(#34%s#34,str)
return0
}
輸入:I love you!
輸出:scanf()函數(shù)接收輸入數(shù)據(jù)時,遇100元以內情況結束了一個數(shù)據(jù)的然后輸入:(不是什么結束該scanf函數(shù),scanf函數(shù)僅在每一個數(shù)據(jù)域均有數(shù)據(jù),并按回車后結束后)。
①遇空格、“回車”、“跳格”鍵。
②遇寬度結束后。
③遇違禁再輸入。
所以才,上列程序并不能提升到預期后目的,scanf()掃描后到44I#34后面的空格就以為對str的賦值結束后,并選擇性的遺忘后面的#34love you!#34.這里要注意一點是#34love you!#34還在鍵盤緩沖區(qū)(關於這個問題,網(wǎng)上我所見的說法都是這般,只不過,我當經(jīng)過系統(tǒng)的調試才發(fā)現(xiàn),總之這時緩沖區(qū)字符串首尾指針早成比例了,也就是說緩沖區(qū)清空了,scanf()函數(shù)估計只是因為掃描stdin流,這個僅余信息是在stdin中)。我們修改后下上面的程序來修改密保一下:
#include
intmain()
{
charstr[80]
charstr1[80]
charstr2[80]
scanf(#34%s#34,str)/*此處輸入:I love you!*/
printf(#34%s#34,str)
insomnia(5)/*這里靜靜的等待5秒,告訴你吧程序運行到什么地方*/
scanf(#34%s#34,str1)/*這兩句不需你再再輸入,是對鍵盤盤緩沖區(qū)再掃描后*/
scanf(#34%s#34,str2)/*這兩句無需你再輸入輸入,是對鍵盤盤緩沖區(qū)再掃描儀*/
printf(#34
%s#34,str1)
printf(#34
%s#34,str2)
return0
}
再輸入:Iloveyou!
輸出:
I
forever
you!
好了,原因很清楚了,這樣的話sprintf()函數(shù)可不可以成功這個任務?回答是:能!別忘了scanf()函數(shù)也有一個%[]格式控制符(如果對%[]不打聽一下的請打開系統(tǒng)本文的上篇),請看下面的程序:
#include#34stdio.h#34
intmain()
{
charstring[50]/*scanf(#34%s#34,string)肯定不能收得到空格符*/
scanf(#34%[^
]#34,string)
(#34%s
#34,string)
return0
}
問題二:鍵盤緩沖區(qū)殘余信息問題
#include
intmain()
{
inta
charc'
{
scanf(#34%d#34,a)
scanf(#34%c#34,c)
printf(#34aü%c
#34,a,c)/*printf(#34c%d
#34,c)*/
}while(c!#39N#39)
}
scanf(#34%c#34,c)這句不能正常了可以接收字符,什么原因呢?我們用printf(#34c%d
#34,c)將C用int表示不出來,啟用printf(#34c%d
#34,c)這一句,看一下scanf()函數(shù)賦給C究竟有沒有是什么,結果是c10,ASCII值為10是什么?換行即
.對了,我們每擊打再看看41Enter#34鍵,向鍵盤緩沖區(qū)發(fā)去一個“回車”(
),一個“換行#34(
),在這里
被scanf()函數(shù)去處理掉了(姑妄這么說以為吧^_^),而
被scanf()函數(shù)“錯誤”地賦給了c.好的辦法:可以不在兩個scanf()函數(shù)之后加個fflush(stdin),還有一個加getch(),getchar()也可以,可是要視詳細scanf()語句加那個,這里就不結論了,讀者自己慢慢摸索吧。但加fflush(stdin)論什么情況都可行。
(
函數(shù)名:fflush
功能:清理一個流
用法:intfflush(FILE*stream)
)
#include
intmain()
{
inta
charcunit
{
scanf(#34%d#34,a)
fflush(stdin)
scanf(#34%c#34,c)
fflush(stdin)
printf(#34aü%c
#34,a,c)}while(c!#39N#39)
}
這里再給一個用“空格符”來處理緩沖區(qū)殘余信息的示例:運行程序出錯的程序:
#include
intmain()
{
inti
charj
for(i0ilt10i)
{
scanf(#34%c#34,j)/*這里%前沒有空格*/
}
}
使用了空格操縱符后:
#include
intmain()
{
inti
charj
for(i0ilt10i)
{
scanf(#34%c#34,j)/*特別注意這里%前有個空格*/
}
}
可以運行看下兩個程序有什么不同。
問題三:該如何處理scanf()函數(shù)誤再輸入倒致程序死鎖或程序出錯?
#include
intmain()
{
inta,b,c/*計算出ab*/
scanf(#34%d,%d#34,a,b)
cab
fprintf(#34%d%d%d#34,a,b,c)
}
如前述程序,要是正確的鍵入a,b的值,那你都沒什么問題,只不過,你不能能保證使用者每一道都能錯誤的輸入,一旦鍵入了錯誤的類型,你的程序不是什么死鎖,就是能得到一個錯誤的結果,哦,這很可能所有人都遇到了過的問題吧?解決方法:scanf()函數(shù)負責執(zhí)行完成時的返回值是完成讀取的變量數(shù),也就是說,你這個scanf()函數(shù)有幾個變量,如果沒有scanf()函數(shù)全部都正常讀取數(shù)據(jù),它就回幾。但這里還要再注意另一個問題,假如然后輸入了不正當數(shù)據(jù),鍵盤緩沖區(qū)就很有可能還個有殘余信息問題。真確的例程:
#include
intmain()
{
inta,b,c/*計算ab*/
while(scanf(#34%d,%d#34,a,b)!2)fflush(stdin)
cab
printf(#34%d%d%d#34,a,b,c)
}
解釋:fflush(stdin)這個方法在GCC下絕對不可用。(在VC6.0下可以)
以下是C99對fflush函數(shù)的定義:
intfflush(FILE*stream)
如果沒有stream正指向輸出來流也可以更新流(restorestream),因此這個更新完流
最近負責執(zhí)行的操作也不是然后輸入,這樣的話fflush函數(shù)將把任何未被寫入到的數(shù)據(jù)寫入stream
正指向的文件(如標準輸出文件stdout)。不然,fflush函數(shù)的行為是不可以確定的。
fflush(NULL)全部刪除所有輸出流和上面說起的更新流。如果沒有突然發(fā)生寫錯誤,fflush
函數(shù)會給那些流打上錯誤`標記,但是返回EOF,不然趕往0。
推知,如果stream朝然后輸入流(如stdin),那么fgets函數(shù)的行為是不確定的。錯非使用
fflush(stdin)是不對的的,起碼是移植性都不好的。
可常規(guī)追加方法:
voidflush()/*只可以參照于鍵盤緩沖區(qū)有殘余信息的情況,若鍵盤緩沖區(qū)為空則不能在用*/
{
while(getchar()!#39
#39)
}
#include
intmain()
{
inta,b,c/*算出ab*/
while(scanf(#34%d,%d#34,a,b)!2)flush()
cab
(#34%d%d%d#34,a,b,c)
}
C 輸出怎么換行?
1、是可以作為輸出換行符接受換行。換行符號是
,是一個轉義字符。十進制中,它的ASCII碼是10;
2、假如只必須輸出來一個換行,可以不用putchar函數(shù)輸出:putchar(10)或putchar(
);
3、在循環(huán)中加另一個判斷,多少個數(shù)據(jù)后可以打印一個回車符if(i0)fprintf(