よくある質問と私が見つけることができる他のすべてを読んだ後、私はまだ混乱しています. この方法で初期化された char ポインターがある場合:
char *s = "Hello world!"
文字列は読み取り専用メモリにあり、次のように変更することはできません:
*s = 'W';
「Wello world!」を作るために。これは理解できますが、私の人生では、それを読み取り専用にしない方法を理解することはできません。ポインターの代わりに配列を使用する必要がありますか? ここのように?
これは私のコードです:
char *s = str;
char *e = s;
while (*e != '\0')
e++;
e--;
char *temp;
//Swop the string around
while (s <= e) {
*temp = *s;
*s = *e;
*e = *temp;
e--;
s++;
}
エラー メッセージは単なるセグメンテーション違反です。これが本当にばかげた質問である場合は、事前に謝罪してください。
すべての助けをありがとう。あなたのアドバイスをすべて取り入れた後、私はこれを得ました:
void something(char * str) {
char *store = str;
char *s = new char[strlen(str) + 1]; //Allocate memory. Nice one.
strcpy(s, str);
char *e = new char[strlen(str) + 1];
strcpy(e, str);
while (*e != '\0')
e++;
e--;
char temp; //no longer a pointer
while (s <= e) {
cout << *e;
temp = *s;
*s = *e;
*e = temp;
e--;
s++;
}
delete [] e;
delete [] s;
}
ただし、関数の最後の削除は、独自のセグメンテーション違反を引き起こしているようです。なんで?
参考までに: エラーは、インクリメントされた後に e および s ポインターにアクセスしたことが原因でした。それから、はるかに簡単な解決策が続きました。
void something(char * str) {
char *s = new char[strlen(str) + 1];
strcpy(s, str);
char temp;
int j = strlen(str) - 1;
for (int i = 0; i <= strlen(str)/2; i++) {
cout << s << endl;
temp = s[i];
s[i] = s[j];
s[j] = temp;
j--;
}
delete [] s;
}