五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > C語言scanf()函數(shù)返回值的問題

C語言scanf()函數(shù)返回值的問題

文章來源:365jz.com     點擊數(shù):658    更新時間:2018-06-02 11:23   參與評論
1.scanf()函數(shù)有返回值且為int型。
2.scanf()函數(shù)返回的值為:正確按指定格式輸入變量的個數(shù);也即能正確接收到值的變量個數(shù)。

scanf("%d%d", &a, &b);
如果a和b都被成功讀入,那么scanf的返回值就是2
如果只有a被成功讀入,返回值為1
如果a和b都未被成功讀入,返回值為0
如果遇到錯誤或遇到end of file,返回值為EOF。

不經(jīng)意中發(fā)現(xiàn)scanf()的返回值問題,自己試驗和了解了一下,一些所知與各位分享;
void main()
{
int a;
int b;
int c;
printf("請輸入三個整數(shù):");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d/n%d/n",a,x);
}
1.scanf()函數(shù)有返回值且為int型。
2.scanf()函數(shù)返回的值為:正確按指定格式輸入變量的個數(shù);也即能正確接收到值的變量個數(shù)。
從上邊的例子中可以得到驗證,這里用變量x接收scanf()函數(shù)的返回值,并輸出顯示出來。

當運行中輸入三個整數(shù):5 6 7則x的值為3;

如果輸入5 6 d(即給c 賦值不正確)則x的值為2;

如果輸入5 t d(即給b和c 賦值不正確)則x的值為1;

當scanf函數(shù)的第一個變量格式不正確時返回值為0,即,當scanf函數(shù)的第n個變量格式不正確時,返回值為n-1



continue:

以前學習的時候書上說的是scanf()的返回值等于得到輸入值的輸入項的個數(shù)
scnaf(格式控制,輸入項表);
照以上一般形式來看的話
main()
{int a,b,i;
i=scanf("%d%d%d",&a,&b);
printf("%d",i);}
應(yīng)該輸出2,因為就a和b兩個輸入項得到值了。
但是結(jié)果卻是3
為什么?
這樣的話是不是應(yīng)該說成得到輸入數(shù)據(jù)的格式說明的個數(shù)?

是3,因為是3個%d,輸入項的個數(shù)是3個,不過是進了緩沖區(qū)3個,兩個被賦值了,一個扔掉了而已。

那scanf()的返回值應(yīng)該是進緩沖區(qū)的數(shù)據(jù)的個數(shù),或是說得到輸入數(shù)據(jù)的格式說明的個數(shù),對嗎?
像這樣scanf("%d%d%d"如果輸入1 2 3那返回值就是3,要是輸入1 a 那返回值就是1因為只有第一個%d得到數(shù)據(jù)了,對嗎?

scanf 函數(shù)的返回值反映的是按照指定的格式符正確讀入的數(shù)據(jù)的個數(shù)。
如果輸入數(shù)據(jù)與指定格式不符,則會產(chǎn)生輸入錯誤。遇到輸入錯誤,scanf函數(shù)會立即終止,返回已經(jīng)成功讀取的數(shù)據(jù)的個數(shù)。
所以,通過scanf函數(shù)的返回值和指定輸入數(shù)據(jù)的個數(shù)(由格式符決定)的比較,可以判斷數(shù)據(jù)輸入是否成功。

就樓主的這個程序而言,是一個錯誤的程序,會導(dǎo)致segmentation fault,
因為沒有有效的地址接受這個輸入的第三個數(shù),whyglinux的解釋是正確的,
如果程序可以正常的繼續(xù)下去執(zhí)行的話,返回值應(yīng)該是2.
具體你的程序為什么能夠返回,我不知道,我用的是gcc,winxp,運行的時候segmentation fault.

1. scanf 函數(shù)是有返回值的,它的返回值可以分成三種情況
  1) 正整數(shù),表示正確輸入?yún)?shù)的個數(shù)。例如執(zhí)行 scanf("%d %d", &a, &b);

      如果用戶輸入"3 4",可以正確輸入,返回2(正確輸入了兩個變量);
      如果用戶輸入"3,4",可以正確輸入a,無法輸入b,返回1(正確輸入了一個變量)。

  2) 0,表示用戶的輸入不匹配,無法正確輸入任何值。如上例,用戶如果輸入",3 4",返回0。
  3) EOF,這是在stdio.h里面定義的常量(通常值為-1),表示輸入流已經(jīng)結(jié)束。在Windows下,用戶按下CTRL+Z(會看到一個^Z字符)再按下回車(可能需要重復(fù)2次),就表示輸入結(jié)束;Linux/Unix下使用CTRL+D表示輸入結(jié)束。

所以可以使用下面的代碼來處理輸入:
while (scanf("%s %c %c", str, &oldchar, &newchar) == 3) /* 或!= EOF , 但前者更好 */
{
    ; //處理
}

2. 為什么前面 scanf 的格式串里面,%s和%c中間需要空格呢?
  那是因為如果沒空格的話。。。oldchar輸入的就是空格了= =.

3. 順便說一下,printf的返回值是輸出的字符數(shù),例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。

以下內(nèi)容原創(chuàng):

不知道有木有這樣寫的習慣while (~scanf("...."))。這里出現(xiàn)了~這個符號,這個是位運算取反的意思。因為~(n)=-(n+1)。所以這里scanf的返回值為-1時~(-1)=0才退出循環(huán)。這就是這樣寫的意思。

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (658人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號