1

このコードがクラッシュする理由を誰か教えてもらえますか? 文字列の長さが 16 を超える場合は、文字列を再度要求します。if 文の中に control = 1 と書けば動きますが、それがなくても同じように動くはずです。その時点での control の値は 1 だからです。ありがとうございます(勉強中です)

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

int
main(void)
{
    int control = 1;
    char word[16] ;
    printf("Enter a word: ");

    while(control == 1)
    {
        scanf("%s", word);

        int len = strlen(word);
        printf("Lenght is: %d\n", len);

        if (len >= 16) 
        {
            printf("Word lenght to long, enter a new one: ");
        }

        else
        {
            control = 0;
        }

    }
    printf("This is the word: %s\n", word );

}
4

3 に答える 3

8

char word[16] は、文字列に 16 バイトのストアを割り当てます。

次に、scanf() は文字列をそのストアに読み込みます。

割り当てられたストアの量を超えて読み込むと、ストアの終了後にメモリが破損します。

それがあなたがクラッシュする理由です。

于 2012-08-05T22:51:58.637 に答える
2

問題は、スペースを割り当てた 15 文字を超えてユーザーが入力した場合、コンピューターはそれらすべてを配列の末尾を超えてメモリに喜んで書き込むことです。これにより、プログラムのクラッシュを含む「未定義の動作」が発生します。

于 2012-08-05T22:55:41.910 に答える
1

他の人が指摘しているように、あなたの根本的な問題は16、文字列に文字を割り当てていることであり、scanfそれらの文字を過ぎて自分のもの16ではないメモリに書き込むことができます。

C では一般的に配列でこれを行うことができることに注意してください。また、標準の C 文字列がどのように機能するかを理解してください。つまり、それらをnull で終了\0する必要があります。

次のように、フィールド幅指定子とを使用して、C 文字列に関して制限する方法あります。scanf%s

char input[17];  // room for 16 characters plus null-terminator

// here scanf will stop after reading 16 characters:
scanf("%16s", input);

このコードを使用すると、 を使用して、文字列を 1 文字以内で安全に埋めることができ、scanf文字列が null で終了します。16scanf

しかし、他の人も指摘しているように、scanfユーザー入力の処理はかなり苦手です。通常はfgets、入力文字列を個別に使用および管理することをお勧めします。

于 2012-08-05T23:25:30.427 に答える