免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
scanf使用容易犯錯的點

曾經(jīng)錯的幾個地方:(xpsp2,vc6.0環(huán)境下)
1.
空白符問題
#include<stdio.h>
main()
  
int a;
printf("input the data\n");
scanf("%d\n",&a);//
這里多了一個回車符\n
    printf("%d",a);
return 0;
}
結(jié)果要輸入兩個數(shù)程序才結(jié)束,而不是預(yù)期的一個。why?
原因:用空白符結(jié)尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數(shù)。這里的空白符包括空格,制表符,換行符,回車符和換頁符。所以如果你用scanf("%d   ",&a)也會出現(xiàn)同樣的問題。
解決方法:這種錯誤大多是輸入的時候不小心,多注意一點就好了。這種問題也不好檢查,編譯沒有問題,一個空格也不容易看出來。當(dāng)你的程序出現(xiàn)上面的問題時,自己對照檢查一下就可以了。


2.
緩沖區(qū)問題
這是一個非常容易錯的地方,我就錯過多次。
#include <stdio.h>
main()
{
int n = 5;
char c[n];
for(int i = 0; i < n; i++)
   c[i] = scanf("%c",&c[i]);
printf(c);
return 0;
}
如果輸入:
a
b
c
那么循環(huán)就會提前結(jié)束了.
原因:輸入a和第一個回車后,a和這個回車符都留在緩沖區(qū)中。第一個scanf讀取了a,但是輸入緩沖區(qū)里面還留有一個\n,第二個scanf讀取這個\n。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執(zhí)行了,并沒有提前結(jié)束。只不過有的scanf讀取到了回車符而已。
解決方法:把程序改成這樣就可以了:
for( i = 0; i < n; i++){
   scanf("%c",&c[i]);
fflush(stdin);//
刷新緩沖區(qū)
}
或者不用scanf,而用gets()函數(shù),如:
#include<stdio.h>
main()
  
char c[5];
gets(c);
printf(c);
return 0;
}
但要注意:這個函數(shù)自動把你最后敲的回車轉(zhuǎn)換為字符'\0'。如果你的輸入超過了數(shù)組的大小,那么就會產(chǎn)生錯誤。


3.scanf()
函數(shù)的參數(shù)輸入類型不匹配問題
這是我在csdn論壇上見到的問題,這個錯誤有時候會讓人莫名其妙。
#include<stdio.h>
main()
{
int a=123;
char c='t';
printf("input\n");
scanf("%d%c",&a,&c);
scanf("%d%c",&a,&c);
scanf("%d%c",&a,&c);
printf("%d\n%c\n",a,c);
return 0;
}
當(dāng)輸入a 回車 后,會直接跳過下面2個scanf語句,直接輸出為
123
t
原因:對于scanf("%d%c",&a,&c),scanf語句執(zhí)行時,首先試圖從緩沖區(qū)中讀入一個%d類型的數(shù)據(jù),如果和第一個參數(shù)匹配,則繼續(xù)從緩沖區(qū)中讀取數(shù)據(jù)和第二個參數(shù)進行匹配,依次進行下去,直到匹配完所有的參數(shù);如果其中有一個參數(shù)不匹配,那就從這個地方跳出,忽略這個scanf后面所有的參數(shù),而去執(zhí)行下一條語句。 
可以用下面的程序驗證一下:
#include <stdio.h>
int main()
{
int a=123,b=1;
char c='t';
    scanf("%d%d",&a,&b);
scanf("%c",&c);
printf("%d\n%d\n%c\n",a,b,c);
return 0;
}
輸入:2 回車a 回車
結(jié)果是:
2
1
a
解決方法scanf()函數(shù)執(zhí)行成功時的返回值是成功讀取的變量數(shù),也就是說,你這個scanf()函數(shù)有幾個變量,如果scanf()函數(shù)全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數(shù)據(jù),鍵盤緩沖區(qū)就可能還個有殘余信息問題。
比如:
#include <stdio.h>
main()
{
int a=123,b;
while(scanf("%d%d",&a,&b)!=2)
   fflush(stdin);
printf("%d\n%d\n",a,b);
return 0;
}
你可以試一下,如果輸入不是數(shù)字時,會有什么反應(yīng)。

補充scanf中一種很少見但很有用的轉(zhuǎn)換字符:[...][ ^...]。
#include<stdio.h>
main()
{
char strings[100];
scanf("%[1234567890]",strings);
printf("%s",strings);
return   0;
}
運行,輸入:1234werew后,結(jié)果是:1234。
通過運行可以發(fā)現(xiàn)它的作用是:如果輸入的字符屬于方括號內(nèi)字符串中某個字符,那么就提取該字符;如果一經(jīng)發(fā)現(xiàn)不屬于就結(jié)束提取。該方法會自動加上一個字符串結(jié)束符到已經(jīng)提取的字符后面。 
scanf("%[^1234567890]",strings);
 它的作用是:如果一經(jīng)發(fā)現(xiàn)輸入的字符屬于方括號內(nèi)字符串中某個字符,那么就結(jié)束提??;如果不屬于就提取該字符。該方法會自動加上一個字符串結(jié)束符到已經(jīng)提取的字符后面。 
注意:方括號兩邊不能空格,如:scanf("%[ 1234567890 ]",strings); scanf("%[ ^1234567890 ]",strings); 不讓空格也會算在里面的。
用這種方法還可以解決scanf的輸入中不能有空格的問題。只要用
scanf("%[^\n]",strings);
 就可以了。很神奇吧。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語言scanf函數(shù)詳細解釋
c語言學(xué)習(xí)零碎整理(10):探討scanf函數(shù)
c語言輸入輸出緩沖區(qū)的概念_仙劍系列
[zz]scanf()函數(shù)釋疑
記錄編程中的一些經(jīng)驗 - 1
詳解C語言中scanf函數(shù)使用的一些注意點
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服