反转c中的字符串

Reverse a string in c

本问题已经有最佳答案,请猛点这里访问。

我正在尝试将字符串反向转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void reverseStr(char *str)
{
 int i;
 int length;
 int last_pos;
 length = strlen(str);
 last_pos = length-1;

 for(i = 0; i < length / 2; i++)
 {
   char tmp = str[i];
   str[i] = str[last_pos - i];
   str[last_pos - i] = tmp;
 }
}

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400893 in reverseStr (str=0x400974"Haus") at main.c:102
102         str[i] = str[last_pos - i];
(gdb) print i
$1 = 0
(gdb) print last_pos
$2 = 3
(gdb) print str
$3 = 0x400974"Haus"
(gdb) print str[3]
$4 = 115 's'

感谢您的阅读。
我不明白,这条指令怎么会导致错误?问候:)


reverseStr中的代码很好,问题出在调用代码中。您几乎可以肯定将字符串文字或其他只读存储器传递给该函数。

您的呼叫代码很可能是:

1
2
char *str ="my string";//str points to a literal which cannot be modified
reverseStr(str);

但是您需要传递可写内存。像这样:

1
2
char str[] ="my string";
reverseStr(str);

您正在将字符串文字传递给函数。字符串文字在C中不可修改。

1
2
char *p ="this string is non modifiable";
reverseStr(p); // undefined behavior

使用由字符串初始化的数组代替:

1
2
char p[] ="this string is modifiable";
reverseStr(p); // OK

这取决于您如何调用此函数。

  • 如果要传递字符串常量的地址(将类型为{char * str = " String "}的定义称为字符串常量。将字符串常量放入可执行文件的.rodata节中),则\\会收到例外。
  • 如果要传递数组的地址(char arr [] = " String "),则该函数将起作用。