2011-12-14 17 views
3

charの配列をscanfと読み、長さが15より大きいかどうかを確認したい。 ときどき動作する。 (私はエラーを取得しない場合 - >コアダンプ。)C文字配列ユーザー入力チェックの長さ

マイコード:

#include <stdio.h> 

int checkArray(char string[], int length) { 
    int i; 
    for(i=0; string[i] != '\0'; i++); 
    if(i > length) { 
     return -1; 
    } 
    return 0; 
} 

int main() 
{ 
    const int length = 15; 
    char x[15]; 
    scanf("%s", x); 
    if(checkArray(x, length) == -1) { 
     printf("max. 15 chars!"); 
     return 1; 
    } 
    return 0; 
} 

答えて

1

scanfが長い(nullターミネータのための1つを予約)14文字以上の文字列を読み込み、それが破損メモリです。その後、カップルのごcheckArray()方法に問題があります。

int checkArray(char string[], int length) { 
    int i; 

    // This next line could as well be a call to `strlen`. 
    // But you shouldn't let it access `string` when `i` is >= `length`. 
    for(i=0; string[i] != '\0'; i++); 

    // This should be `>=`. If `i` is 15, you accessed (in the loop above) 
    // `string[15]`, which is past the end of the array. 
    if(i > length) { 
     return -1; 
    } 

    return 0; 
} 
5

xあなたがサイズ15のバッファにそれを持っているので、(合法的に)15文字以上の大きななることはありません(文字の場合は14スペース、NULターミネーターの場合は1スペース)、15文字未満であるかどうかを確認することは無意味です。

14より大きい文字列を格納しようとすると、配列がオーバーランし、発生しているようなエラーが発生する可能性があります。

char x[30]; 

scanf("%29s", x); // read a maximum of 29 chars (replace 29 if needed 
        // with one less than the size of your array) 

checkArray(x, 15); 
+0

文字列は 'x' 17:15、オーバーフローは1つ、' \ 0 '。 – Kevin

0

それは古典的なバッファオーバーフローです:それは実際には15個の以上の文字を保持し、%sのために幅指定子を置くことができるように、必要に応じて使用するアレイを大きくします。あなたはで読み出したデータの長さを制限する必要があります。

scanf("%14s", x); 

代わりに、あなたはあなたのためのバッファを割り当てるのscanfを伝えることができます。

char* x; 
scanf("%as", &x); 
... 
checkArray(x, 15); 

これは、任意の文字列をあなたのために十分な長さのバッファを割り当てますそれを与える。 (もちろん、実際のメモリとアプリケーションの悪意のあるユーザーが10GBのデータを送信するという制限)。それが必要となりますので、この文字列は動的に割り当てられている

を解放する:

free(x); 
+0

彼はユーザーが15文字以上を入力したかどうかを知りたがっています。 – Alin

+0

downvoteの理由は? –

+0

これを編集する前で、動的割り当て部分を追加しました。 – Alin

0

の代わりに-1を返すと0リターンな長さと何かを代わりに-1と私の代わりに、0はそれに応じて、main関数で条件を変更してください。 プログラムは毎回出力を出すでしょう(論理はわかりませんが私にとってはうまくいく)

関連する問題