0

C の基礎を学ぼうとしていますが、このコードが機能しない理由がわかりません。reverse() の while ループでバス エラーが発生します。有効な解決策として、プログラミング インタビュー ブックでほぼ同一のコードを見つけましたが、これも、ここに投稿された他の同様の方法も、バス エラーなしでは機能しません。

#include <stdio.h>

void reverse(char* str) {
 char* end = str;
 char tmp = 0;
 if(str) {
  while(*end) {
   end++;
  }
  --end;
  while(end>str) {
   tmp = *end;
   *end-- = *str;
   *str++ = tmp;
  }
 }
}

int main() {
 char* a = "12";
 puts(a);
 reverse(a);
 puts(a);

 return 0;
}
4

3 に答える 3

5

問題は、読み取り専用の定数リテラル文字列を逆にしようとしていることです。ainの宣言をmaintoに変更しchar a[] = "12";て、代わりに書き込み可能な char 配列にします。

于 2011-01-24T19:02:44.677 に答える
2

未定義の動作につながる文字列リテラルを変更しようとしています。

変化する

char* a = "12";

char a[] = "12";
于 2011-01-24T19:03:23.763 に答える
-2

endstrが同じメモリ位置を指しているため-> それらは同じオブジェクトの 2 つの異なる名前です。2 つの変数の使用を避けることができます。

char foo[20] = "abcdefghi", tmp;
int counter = 0, length = strlen(foo);

for(counter, counter < length / 2; counter++) {
    tmp = foo[counter];
    foo[counter] = foo[length - counter];
    foo[length - counter] = tmp;
}
于 2011-01-24T19:03:43.847 に答える