0

いくつかの特殊文字 (&、|、<、>) の間にスペースを追加するループを実行しています。次のコードは、特殊文字の前後にスペースを正常に追加します。

    char keys[] = "<>&|";
    int i = strcspn (input,keys); 
    appenda(input, " " , i);
    appenda(input, " " , i+2);

上記のコードは、入力 "asdf&asdf" を "asdf & asdf" に変換します。

ただし、私の目標は、複数の特殊文字 (「asdf&asdf&asdf」など) を使用する場合でも、入力全体のすべての特殊文字に対してそれを行うことです。だから私はwhileループを作りました:

    char keys[] = "<>&|";
    int i = strcspn (input,keys);
    while(i < strlen(input)){
        appenda(input, " " , i);
        appenda(input, " " , i+2);
        i = strcspn (input,keys);
    }

それでも、今コードを実行すると、「* **スタック破壊が検出されました* **」が返されます

これが何を意味し、どのように回避するかについてのアイデアはありますか?

EDIT Appenda は、指定されたポイントで文字列を別の文字列に挿入します。3 つの引数を取ります。1 番目は挿入する文字列、2 番目は挿入する文字列、3 番目はインデックスです。したがって、 appenda(ABCD, X, 2) は AXBCD を返します

4

2 に答える 2

4

あなたは常にstrcspn同じ を呼び出しており、input見つけた文字を実際に削除することはないため、常に同じ文字を見つけています。

たとえば、文字列が

asdf&asdf&asdf

への最初の呼び出し

int i = strcspn (input,keys)

が位置 4 にあるi = 3ため、戻ります。次に、スペースを挿入すると、正常に機能し、文字列は次のようになります。&

asdf & asdf&asdf

今、あなたは再び電話をかけます

i = strcspn (input,keys)

そして、これは5 番目の位置i = 4で最初のものを見つけるため、返され&ます。したがって、スペースを再度挿入すると、文字列は次のようになります。

asdf  &  asdf&asdf

等々。最初の の周りにますます多くのスペースを挿入し続け、内部のバッファーをオーバーランしてプログラムが&終了するまでループは終了しません。appenda

代わりに、スペースを挿入したら、前の特殊文字を見つけた場所の次の特殊文字を探し始めるように指示する必要がありますstrcspn。これはうまくいくはずです:

char keys[] = "<>&|";
int i = strcspn (input,keys);
while(i < strlen(input)){
    appenda(input, " " , i);
    i += 2;
    appenda(input, " " , i);
    i += strcspn (input + i,keys);
}

これは の値を「移動」し、iを呼び出したときに、特殊文字がまだ調べられていない次の位置をstrcspn(input + i, keys)値が常に参照するようにします。input + i

于 2012-11-29T06:13:36.880 に答える
2

Tyler McHenry の言うとおりです。代わりに、文字ごとにループして新しい配列にコピーすることをお勧めしますが、これにより、すべての文字を継続的に移動する必要がなくなるためです。そのようです:

int len = 200;
char input[len+1];
char output[len*3+1];
int outPos = 0;
for (int i = 0; i < len; i++)
{
  if (input[i] == 0) break; // end of string
  if (input[i] == '<' || input[i] == '>' || input[i] == '&' || input[i] == '|')
  {
    output[outPos++] = ' ';
    output[outPos++] = input[i];
    output[outPos++] = ' ';
  }
  else
    output[outPos++] = input[i];
}
output[outPos] = 0;
于 2012-11-29T06:43:51.837 に答える