文字列を受け取り、文字列を次の形式で単純にエンコードする (必要に応じて圧縮する) 関数を作成しました: 入力 = aassda 、出力 = 2a2s1d1a。私の問題は、47 文字以上の文字列を入力すると、セグ フォールトが発生することです。以下の関数を添付しました。私は約1週間前にCを始めたので、ご容赦ください=/
編集:改善の提案もいいでしょう。コードをもっと効率的にできることはわかっていますが、Python のバックグラウンドが小さいため、可能な限り直接的な方法で行うことにしました。
文字列を受け取り、文字列を次の形式で単純にエンコードする (必要に応じて圧縮する) 関数を作成しました: 入力 = aassda 、出力 = 2a2s1d1a。私の問題は、47 文字以上の文字列を入力すると、セグ フォールトが発生することです。以下の関数を添付しました。私は約1週間前にCを始めたので、ご容赦ください=/
編集:改善の提案もいいでしょう。コードをもっと効率的にできることはわかっていますが、Python のバックグラウンドが小さいため、可能な限り直接的な方法で行うことにしました。
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);
}
バッファオーバーフローはまだあります。
次の 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」を使用して文字列の最後にします。現在、オーバーフローの問題は完全に修正されています。