欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

scanf使用前怎么定義

錢艷冰2年前14瀏覽0評論

scanf使用前怎么定義?

簡介 scanf函數,與printf函數一樣,都被定義在stdio.h里,因此在使用scanf函數時要加上#include。它是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中,其關鍵字最末一個字母f即為“格式”(format)之意。 [編輯本段]scanf函數的一般形式 scanf(格式控制,地址表列) int scanf(char *format[,argument,...]); “格式控制”的含義同printf函數;“地址表列”是由若干個地址組成的表列,可以是變量的地址,或字符串首地址。 scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。 例:使用scanf函數輸入數據。 #include void main() { int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c); } [編輯本段]格式字符說明 %a,%A 讀入一個浮點值(僅C99有效) %c 讀入一個字符 %d 讀入十進制整數 %i 讀入十進制,八進制,十六進制整數 %o 讀入八進制整數 %x,%X 讀入十六進制整數 %c 讀入一個字符 %s 讀入一個字符串,遇空格、制表符或換行符結束。 %f,%F,%e,%E,%g,%G 用來輸入實數,可以用小數形式或指數形式輸入。 %p 讀入一個指針 %u 讀入一個無符號十進制整數 %n 至此已讀入值的等價字符數 %[] 掃描字符集合 %% 讀%符號 附加格式說明字符表修飾符說明 L/l 長度修飾符 輸入"長"數據 h 長度修飾符 輸入"短"數據 W 整型常數 指定輸入數據所占寬度 * 表示本輸入項在讀入后不賦值給相應的變量 [編輯本段]scanf的返回值 scanf的返回值有后面的參數決定 scanf("%d%d", &a, &b); 如果a和b都被成功讀入,那么scanf的返回值就是2 如果只有a被成功讀入,返回值為1 如果a和b都未被成功讀入,返回值為0 如果遇到錯誤或遇到end of file,返回值為EOF。 且返回值為int型. [編輯本段]使用scanf函數時應該注意的問題 1、sacnf()中的變量必須使用地址。 2、scanf()的格式控制串可以使用其它非空白字符,但在輸入時必須輸入這些字符。 3、在用"%c"輸入時,空格和“轉義字符”均作為有效字符。 問題一:scanf()函數不能正確接受有空格的字符串?如: I love you! #include int main() { char str[80]; scanf("%s",str); printf("%s",str); return 0; } 輸入:I love you! 輸出:scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,并按回車后結束)。 ① 遇空格、“回車”、“跳格”鍵。 ② 遇寬度結束。 ③ 遇非法輸入。 所以,上述程序并不能達到預期目的,scanf()掃描到"I"后面的空格就認為對str的賦值結束,并忽略后面的"love you!".這里要注意是"love you!"還在鍵盤緩沖區(關于這個問題,網上我所見的說法都是如此,但是,我經過調試發現,其實這時緩沖區字符串首尾指針已經相等了,也就是說緩沖區清空了,scanf()函數應該只是掃描stdin流,這個殘存信息是在stdin中)。我們改動一下上面的程序來驗證一下: #include int main() { char str[80]; char str1[80]; char str2[80]; scanf("%s",str);/*此處輸入:I love you! */ printf("%s",str); sleep(5);/*這里等待5秒,告訴你程序運行到什么地方*/ scanf("%s",str1);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */ scanf("%s",str2);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */ printf("\n%s",str1); printf("\n%s",str2); return 0; } 輸入:I love you! 輸出: I love you! 好了,原因知道了,那么scanf()函數能不能完成這個任務?回答是:能!別忘了scanf()函數還有一個 %[] 格式控制符(如果對%[]不了解的請查看本文的上篇),請看下面的程序: #include "stdio.h" int main() { char string[50];/*scanf("%s",string);不能接收空格符*/ scanf("%[^\n]",string); printf("%s\n",string); return 0; } 問題二:鍵盤緩沖區殘余信息問題 #include int main() { int a; char c; do { scanf("%d",&a); scanf("%c",&c); printf("a=%d c=%c\n",a,c);/*printf("c=%d\n",c);*/ }while(c!='N'); } scanf("%c",&c);這句不能正常接收字符,什么原因呢?我們用printf("c=%d\n",c);將C用int表示出來,啟用printf("c=%d\n",c);這一句,看看scanf()函數賦給C到底是什么,結果是c=10 ,ASCII值為10是什么?換行即\n.對了,我們每擊打一下"Enter"鍵,向鍵盤緩沖區發去一個“回車”(\r),一個“換行"(\n),在這里\r被scanf()函數處理掉了(姑且這么認為吧^_^),而\n被scanf()函數“錯誤”地賦給了c.解決辦法:可以在兩個scanf()函數之后加個fflush(stdin);,還有加getch() , getchar()也可以,但是要視具體scanf()語句加那個,這里就不分析了,讀者自己去摸索吧。但是加fflush(stdin);不管什么情況都可行。 ( 函數名: fflush 功 能: 清除一個流 用 法: int fflush(FILE *stream); ) #include int main() { int a; char c; do { scanf("%d",&a); fflush(stdin); scanf("%c",&c); fflush(stdin); printf("a=%d c=%c\n",a,c); }while(c!='N'); } 這里再給一個用“空格符”來處理緩沖區殘余信息的示例:運行出錯的程序: #include int main() { int i; char j; for(i = 0;i < 10;i++) { scanf("%c",&j);/*這里%前沒有空格*/ } } 使用了空格控制符后: #include int main() { int i; char j; for(i = 0;i < 10;i++) { scanf(" %c",&j);/*注意這里%前有個空格*/ } } 可以運行看看兩個程序有什么不同。 問題三: 如何處理scanf()函數誤輸入造成程序死鎖或出錯? #include int main() { int a,b,c; /*計算a+b*/ scanf("%d,%d",&a,&b); c=a+b; printf("%d+%d=%d",a,b,c); } 如上程序,如果正確輸入a,b的值,那么沒什么問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的類型,你的程序不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?解決方法:scanf()函數執行成功時的返回值是成功讀取的變量數,也就是說,你這個scanf()函數有幾個變量,如果scanf()函數全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數據,鍵盤緩沖區就可能還個有殘余信息問題。正確的例程: #include int main() { int a,b,c; /*計算a+b*/ while(scanf("%d,%d",&a,&b)!=2)fflush(stdin); c=a+b; printf("%d+%d=%d",a,b,c); } 補充: fflush(stdin)這個方法在GCC下不可用。(在VC6.0下可以) 以下是 C99 對 fflush 函數的定義: int fflush(FILE *stream); 如果stream指向輸出流或者更新流(update stream),并且這個更新流 最近執行的操作不是輸入,那么fflush函數將把任何未被寫入的數據寫入stream 指向的文件(如標準輸出文件stdout)。否則,fflush函數的行為是不確定的。 fflush(NULL)清空所有輸出流和上面提到的更新流。如果發生寫錯誤,fflush 函數會給那些流打上錯誤標記,并且返回EOF,否則返回0。 由此可知,如果 stream 指向輸入流(如 stdin),那么 fflush 函數的行為是不確定的。故而使用 fflush(stdin) 是不正確的,至少是移植性不好的。 可采用如下方法: void flush() /* 只適用于鍵盤緩沖區有殘余信息的情況,若鍵盤緩沖區為空則不能使用 */ { while (getchar() != '\n') ; } #include int main() { int a,b,c; /*計算a+b*/ while(scanf("%d,%d",&a,&b)!=2) flush(); c=a+b; printf("%d+%d=%d",a,b,c); }

java 轉義函數,scanf使用前怎么定義