這裡寫一下有關scanf函式與printf深入一點了解!廢話不多說,直接上乾貨。
scanf函式
注意點1:
首先給出scanf函式的原型:int scanf(const char * restrict format,…); 可以看到,scanf函式其實是有返回值的,是乙個int型資料,可能大家幾乎沒有怎麼用到過他的返回值(其實我也沒有怎用過,可能我看過的程式還不太多,還沒有碰到過。)但是,在這裡還是得對它全面了解一哈。這個返回的scanf成功讀取的資料項的個數。如果遇到了eof(即你輸入的是ctrl+z),返回的是-1,如果讀取發生錯誤,就會返回0。什麼是讀取錯誤捏。意思是你如果有如下語句: 首先給出scanf函式的原型:int scanf(const char * restrict format,…); 可以看到,scanf函式其實是有返回值的,是乙個int型資料,可能大家幾乎沒有怎麼用到過他的返回值(其實我也沒有怎用過,可能我看過的程式還不太多,還沒有碰到過。)但是,在這裡還是得對它全面了解一哈。這個返回的scanf成功讀取的資料項的個數。如果遇到了eof(即你輸入的是ctrl+z),返回的是-1,如果讀取發生錯誤,就會返回0。什麼是讀取錯誤捏。意思是你如果有如下語句:
int a=10;
int num=scanf("%d\n",&a);
但是你卻輸入的非數字,例如字元a,就會導致scanf函式讀取錯誤。scanf函式就會返回0。
注意點3:
scanf和緩衝有關的問題。可能大家都遇到過:
int a=10;
char ch;
scanf("%d",&a);
scanf("%c",&ch);
然後你輸入資料後發現,怎麼我還沒有輸入第二個資料,就結束輸入了。原因就是scanf()緩衝的問題,這裡僅僅介紹一哈scanf()的行緩衝。
行緩衝 :
當在輸入和輸出中遇到換行符時,執行真正的i/o操作。這時,我們輸入的字元先存放在緩衝區,等按下回車鍵換行時才進行實際的i/o操作。典型代表是標準輸入(stdin)和標準輸出(stdout)。
所以說,你輸入的回車沒有被scanf()函式認為是分割符,而是被下乙個%c所接收走了,因為scanf()是行緩衝,所以你輸入乙個回車就結束本次scanf()了。為了克服這個問題。也有幾個方法:
方法一:fflush(stdin);可移植性不強。這個是微軟公司自己定義的,不在c的標準庫里。
方法二:萬能清空快取語句。
while((ch = getchar()) != 『\n』 && ch != eof);這個是十分推薦大家使用的。那麼你的程式寫成:
scanf("%d",&a);
while((ch = getchar()) != 『\n』 && ch != eof);
scanf("%c",&ch);
就可以了。
方法三:其實還有乙個簡單的方法:直接寫成:
scanf("%d",&a);
getchar();
scanf("%c",&ch);
就好了。
printf函式
函式原型:int printf(const char *format,…);
注意1:
printf()函式特別要注意的地方就是轉化說明符的使用。上乙個例子大家就比較清楚了。
printf("%c",97);
printf("%c",336);
大家都知道第乙個會列印出a,因為a的ascii碼與97對應,但是這個336沒有與之對應的。那編譯器是怎麼處理的捏。此時編譯器是會發生截斷的。即336的二進位制為:0000 0001 0101 0000 而%c編譯器解釋的是char,所以他將僅僅只要乙個位元組的資料,即後面8位。而這個變成十進位制數為80,對應的為字元p,所以將會列印p。這裡引用c primer plus書本上的一句話:更技術一點,您可以說,該數字被解釋為「以256為模」,意即使用數字被256除的餘數。(336%256=80)
注意2:
當然,最恐怖的是你如果寫成這樣的**,可能結果就會十分奇怪了。
int a=10;
printf("%f\n",a);
double b=10;
printf("%d\n",b);
你就會發現你的結果為0(0.000000)。這個原因也是因為資料在電腦中存貯的方式二進位制,分為有符號與無符號。這裡就不多講了。一定要注意的是,使用printf()函式時,一定要記得資料型別之間要配套使用。
這裡是我參考過的文章:大家也可以去看看!
老師也說堅持寫部落格是十分好的習慣,所以,我希望你可以堅持下去!
關於scanf函式
scanf函式是程式設計中最長使用的函式之一了,掌握scnaf函式的使用是學好程式設計的基礎。首先是scanf函式的返回值問題 如果scanf函式返回的是執行一次讀取,匹配成功的個數。如 scanf d d d a,b,c 如果輸入1,2,3,返回值為3,如果輸入1 2 b 4讀取到b後就結束了,返...
scanf函式與scanf s函式
ansi c中沒有scanf s 只有scanf scanf 在讀取時不檢查邊界,所以可能會造成記憶體洩露。所以vc 2005 2008中提供了scanf s 在最新的vs2013中也提供了scanf s 在呼叫時,必須提供乙個數字以表明最多讀取多少位字元。目前最新的c11標準中已經將scanf s...
關於scanf和gets函式
首先,我描述一下我遇到的問題。先輸入乙個整數,回車,然後迴圈n次gets string 字串。輸出的結果,第乙個是空,從第二項開始有值。這是為什麼呢?int n,cnt 0 cin n vectorv 1000 while cnt本道題用gets 的好處在於,可以直接讀取一整行,空格也可以讀進去。如...