2016-11-08 130 views
1

C代碼是這樣的:爲什麼scanf無法爲輸入參數賦值?

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char s[10]; 
    int i = 0, j = 0, k = 0; 

    memset(s, 0xff, sizeof(s)); 
    scanf("%9s%d%d%d", s, &i, &j, &k); 
    printf("%s,%d,%d,%d\n", s, i, j, k); 
} 

爲了避免緩衝區溢出,我在scanf使用%9s。但我發現,如果輸入的字符串長度小於10,結果正如我預料:

# ./test 
short 1 2 3 
short,1,2,3 

雖然長度較長或等於10ijk不能獲得輸入:

# ./test 
verylongstr 1 2 3 
verylongs,0,0,0 

如何理解scanf的行爲?

+0

如果你分配10個字節並把12個字節存在那裏,你得到的任何東西都是純粹的巧合。你可能會遇到崩潰,或者錯誤的答案,或者正確的答案,或者惡魔飛出你的鼻子。一旦違反規則,編譯器沒有義務做任何明智的事情。 –

+0

@LeeDanielCrocker這就是使用'%9s'的全部觀點,他在他的問題中解釋了這一點。 – Barmar

回答

2

您告訴scanf最多可以將9個字符讀入s,這就是它的功能。一旦它讀取了9個字符,它會嘗試將整數讀入i,但下一個輸入字符是t(第十個字符)。這不能轉換爲整數,所以掃描終止並且scanf返回1,表示它成功讀取單個值。

不幸的是,你永遠不會檢查返回值。你應該解決這個問題。

t返回到內部緩衝區,所以下一個scanf調用將以該字符開始。

相關問題