-3

コードを実行しようとするとセグメンテーション エラーが発生し、このブロックに絞り込みましたが、理由がわかりません。

string myNewKey = "";

if (keylength < length){
    int myValue = ((length - keylength) / keylength) + 1;

    for (int i=0; i < myValue; i++)
        myNewKey = strcat(key, myNewKey);  
}

printf("%s", myNewKey);

と関係があることは知っていますが、strcat正確にはわかりません。

明確にするために。これは学校や仕事用ではありません。私は独学で C を学ぼうとしており、ハーバード大学のオープン コースのプログラミング入門クラスの講義に従っています。

4

2 に答える 2

2

ジョナサンの同じ仮説で:

strcat はすでに追加を行い、キーを変更してから、キーへのポインタを返します。あなたはそれを知っていますか?

これは、2 番目のステップで、セグメンテーション違反を引き起こすのに十分な strcat(key,key) と同等のものを取得することを意味します (strcat の実装によって異なります)。

strcat(key,key) が障害の原因でない場合、次のことが起こります。

キー = "A" を開始し、myvalue を 5 に設定すると、次の手順が実行されます。

  1. キー = "A"、myNewKey = "A"
  2. キー = "AA"、myNewKey = "AA"
  3. キー = "AAAA"、myNewKey = "AAAA"
  4. キー = "AAAAAAAA"、myNewKey = "AAAAAAAAA"
  5. キー = "AAAAAAAAAAAAAAAA"、myNewKey = "AAAAAAAAAAAAAAAAAA"

各ステップでわかるように、2 つのストリングの長さは指数関数的に増加します。それはあなたが意図したことではないと思います。

于 2012-08-22T06:43:39.003 に答える
2

Cには と呼ばれる標準型がstringなく、それをどのように定義したかを示していません。

ただし、次のように推測できます。

char *myNewKey = "";

if (keylength < length)
{
  int myValue = ((length - keylength) / keylength) + 1;
  for (int i = 0; i < myValue; i++)
      myNewKey = strcat(key, myNewKey);
}

printf("%s", myNewKey);

の宣言を見なくても、keyトラブルが発生することがわかります。あなたが持っていると仮定しましょう:

char key[100] = "a";

ループを頻繁に反復する場合 (繰り返しになりますが、何をしようとしているのかを確認するのに十分な情報がありません —短い自己完結型の正しい (コンパイル可能な) 例 を構成するものをブラッシュアップしてください)。遅かれ早かれバッファがオーバーフローし、問題発生したり、セグメンテーション違反が発生する可能性があります。

keystring私の仮説のようなものである場合myNewKey、あらゆる種類のスペース割り当ての問題があり、さらに読み取り専用メモリに書き込んでいる可能性があります (セグメンテーション違反とコア ダンプを取得する良い方法です)。

stringkeyおよびmyNewKey( は言うまでもなく)の他の定義についてはlengthkeylength問題に遭遇する他の方法があります。

おそらく、ステートメント"%s\n"内のフォーマット文字列 ( )の最後に改行を追加する必要があります。printf()それがないと、出力がタイムリーに表示される保証はありません (それでも出力がタイムリーに表示されない可能性がありますが、ターミナル ウィンドウで実行されているプログラムは通常、各行を末尾の改行として出力します)。書かれた)。

于 2012-08-22T06:13:45.430 に答える