1

文字列を受け取り、文字列を次の形式で単純にエンコードする (必要に応じて圧縮する) 関数を作成しました: 入力 = aassda 、出力 = 2a2s1d1a。私の問題は、47 文字以上の文字列を入力すると、セグ フォールトが発生することです。以下の関数を添付しました。私は約1週間前にCを始めたので、ご容赦ください=/

編集:改善の提案もいいでしょう。コードをもっと効率的にできることはわかっていますが、Python のバックグラウンドが小さいため、可能な限り直接的な方法で行うことにしました。

4

2 に答える 2

2

stringただのジャンクポインタです。設定されることはなく、メモリに関連付けられることもありません。malloc()メモリが必要になるかstring(完了したら忘れないでくださいfree()!)、または配列にする必要があります。つまり、次の 2 つの選択肢があります。

malloc()/の使用free():

int main()
{
    char* string = malloc(51); // Room for 51 chars (50 letters and 1 null terminating character)

    printf("Please input a string of at most 50 chars: ");
    scanf("%s", string);
    lame_function(string);

    free(string);
}

配列の使用:

int main()
{
    char string[51]; // Room for 51 chars (50 letters and 1 null terminating character)

    printf("Please input a string of at most 50 chars: ");
    scanf("%s", string);
    lame_function(string);
}
于 2013-01-22T05:19:03.460 に答える
0

バッファオーバーフローはまだあります。

次の 2 つのコード スニペットを見てください。

char* string = malloc(51);
char string[51];

これらのステートメントはどちらも、50 文字分のスペースを割り当てるのに十分です。scanf() はどうですか?

scanf("%s", string);

これにより、ユーザーが最大 50 文字しか与えられないことが保証されますか? いいえ、決して。ユーザーが 50 文字を超えて入力するとどうなりますか? . したがって、オーバーフローを防ぐためにいくつかの方法を使用する必要があります。そのために、ループでgetc()関数を使用できます。fgets()を使用した別の簡単な方法を以下に説明します。

fgets(str, 50, stdin);
i = strlen(str)-1;
  if( str[ i ] == '\n') 
      str[i] = '\0';

fgets() は、キーボードである stdin から最大 50 文字を読み取るか、ユーザーが Enter ボタンを押したときに読み取ります。最後の文字が「\n」の場合は、「\0」を使用して文字列の最後にします。現在、オーバーフローの問題は完全に修正されています。

于 2013-01-22T07:07:34.143 に答える