2016-11-08 11 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を使用しています。

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

長さが長い場合や10ijkに等しい入力を取得することはできませんが。しかし、私は、入力文字列の長さが10よりも短い場合、結果は私が期待しているようです見つけます: scanfの行動を理解するための方法

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

+0

10バイトを割り当ててそこに12バイトを入れると、あなたが得るものは純粋に偶然です。あなたはクラッシュ、間違った答え、正しい答え、あるいは鼻から飛び出す悪魔を得るかもしれません。コンパイラは、一度ルールを破ると、賢明なやり方をする義務はありません。 –

+0

@LeeDanielCrockerこれは、彼が彼の質問で説明した '%9s 'の使用の要点です。 – Barmar

答えて

2

scanfには、最大9文字をsに読み込むように指示します。 9文字を読み終えたら、整数をiに読み込みますが、次の入力文字はt(10文字目)です。これは整数に変換できないため、スキャンは終了し、scanfは1を返し、1つの値を正常に読み取ったことを示します。

残念ながら、戻り値は決してチェックしません。それを修正する必要があります。

tが内部バッファに戻されるため、次のscanfコールはその文字で開始されます。

関連する問題