2011-01-10 10 views
5

私は以下のコードに小さな問題があります。これはcharとintの2つの配列を読み込む簡単なプログラムです。次に、すべてのコンテンツを別の文字列に格納し、それを出力します。エラー:変数 'string'の周りのスタックが壊れていました

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

int main() 

{ 
    char string [50]; 
    char first [11]; 
    char last [16]; 
    int age = 0; 


    printf("Please type in your first name: "); 
     scanf("%s", first); 

    printf("Please type in your last name: "); 
     scanf("%s", last); 

    printf("Please type in your age: "); 
     scanf("%d", &age); 

    sprintf(string, "Your name is %s %s and you are %d years old.", first, last, age); 
     puts(string); 

    getchar(); 
    getchar(); 

    return 0; 
} 

は今、プログラムは正常に実行されているが、私はそれを閉じたときに、私は次のエラーを取得する: ランタイムチェックの失敗#2 - 変数「文字列」を中心にスタックが壊れていました。 これはちょっと混乱していて、どこに問題があるのか​​わかりません。私は のアドバイスに感謝します。

+1

C99(またはその一部を保証している)がある場合、代わりにこの種の問題が発生しないようにするには、snprintfを使用する必要があります。 –

答えて

13

あなたはそれが部屋のために割り当てられているよりも、「文字列」に複数の文字を書いている(すなわち50以上)

あなたが最初、最後の年齢に値を追加する前に"Your name is %s %s and you are %d years old."で37の文字があります。これは、3つの変数すべてに対してわずか13個の文字を残します。スタック上の変数 'string'の後ろに宣言された他の変数にはそれが渡ります。

Jonが述べたように、書き込む量を制限する関数( 'n'バリアント)を使用することをお勧めします。そうしないと、バッファオーバーランエクスプロイトのソースになる可能性があります。

BTW 'string'は変数の名前が非常に貧弱です。

1

私はそれがstring配列の長さは(私が右数えた場合)を加えた後、アップfirstのための11と別の16からlastをするためにあなたはsprintfの37を持っている、50個の文字であるという事実とは何かだと思うだろう、プラス2歳または3歳になります。それは50以上になります。すべて正常に動作しますが、割り当てられた50文字の終わりを超えて上書きする可能性が非常に高いです。それは "うまくいく"でしょうが、あなたが見てきたようにスタックを破壊します。

4

他にも10文字までの姓と15文字までの姓が使用できます。これらの制限に達しても(超過していない)年齢が2桁の場合は、66文字になります。ヌルターミネーターを含めるには、stringを67文字の配列にする必要があります。

それ以外では、入力のサイズを制限する機能や書式文字列を使用する必要があります。現在、他のビットのメモリを踏みにじるなど、10文字以上のファーストネームを入力すると。私はCを書いてからしばらくしていますが、 "%10s"と "%15s"の書式文字列を使用すると、この点で助けになるかもしれません - またはfgetsを使用してください。

同様に、オーバーフロー出力の問題を避けるため、sprintfの代わりにsnprintf(またはご利用の場合はsnprintf_s)を使用することをお勧めします。あまりにも:)

+0

あなたは 'scanf 'でサイズを制限できますが、その限界に達するとグレースフルリカバリが不必要に難しくなるので、他の機能を推奨するには+1してください。 –

2

あなたは最大9つの文字を読み込みます

scanf("%9s", foo) 

が、その後、NUL追加とscanfの読み取り文字の量を制限することができ、エラーを検出するために、これらの方法のすべての戻り値を使用し、これは、サイズ10のバッファに適しています。

関連する問題