2012-05-06 113 views
16

我知道簽名是c中的scanf函數返回什麼?

int scanf(const char *format, ...) 

要什麼這個int值有關?

+2

不僅僅是谷歌'回報scanf'的價值。你會得到這麼多的鏈接,包括一些SO帖子的答案。 –

+7

函數可能不會返回。也許你的意思是'int p = scanf('%d',&g);'? – wildplasser

+3

你的代碼錯了,應該是'int p = scanf('%d',&g);'所以它是未定義的行爲 – Flexo

回答

28

man頁:

NAME 
     scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf 

     ... 

RETURN VALUE 
     These functions return the number of input items successfully matched 
     and assigned, which can be fewer than provided for, or even zero in the 
     event of an early matching failure. 

     The value EOF is returned if the end of input is reached before either 
     the first successful conversion or a matching failure occurs. EOF is 
     also returned if a read error occurs, in which case the error indicator 
     for the stream (see ferror(3)) is set, and errno is set indicate the 
     error. 

在你的情況,scanf()可以返回01EOF

P.S.正如其他人所指出的那樣,你缺失在g前面的符號:

int p=scanf("%d",&g); 

沒有符號,你的代碼的行爲是不確定的。

+0

[''scanf()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/) scanf.html)返回已成功掃描的項目數a nd分配。如果格式字符串是'「%s%d%f%* s%n%d」',那麼如果一切正常,它將返回4。'%* s'禁止賦值,因此不計數,'%n'返回一個偏移量,不計數。如果您獲得0,1,2或3,則出現問題。如果沒有數據需要讀取,或者存在輸入錯誤(不是格式錯誤,而是「硬件」錯誤),則只返回EOF。使用''%d''格式,只有一次轉換,所以你會得到'EOF','0'或'1'。 –

8

scanf

成功時,該函數返回成功讀取的項目數。如果發生匹配故障,此計數可以匹配預期的讀數數量或更少,甚至爲零。 如果在成功讀取任何數據之前輸入失敗,則返回EOF。

0

我想是因爲你忘了在scanf函數的「&」你的代碼不會正常工作..

int g=0; //init the variable 
int p=scanf("%d",&g); 

的scanf函數會將輸入的值與G變量地址。

+3

你爲什麼認爲變量需要初始化? –

1

從技術上講,這是UB(未定義的行爲)。

int g; 
int p=scanf("%d",g); 
       ^

你傳遞一個未初始化整數SCANF使用它作爲寫入地址。從這時起,任何事情都可能發生。您的應用很可能會崩潰。

0

不管你會給在VDU輸入變爲可變g,如果成功讀取,p等於1

1

它將返回1作爲scanf函數返回的項數成功讀取