關於scanf函式與printf函式應該注意的點

2021-09-02 19:59:28 字數 2211 閱讀 5881

這裡寫一下有關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 的好處在於,可以直接讀取一整行,空格也可以讀進去。如...