在c中反转一个字符串

时间:2013-03-20 19:59:58

标签: c string reverse

我试图将字符串反转到位。

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'

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

3 个答案:

答案 0 :(得分:5)

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

您的主叫代码很可能是:

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

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

这取决于你如何调用这个函数。

  • 如果你传递一个字符串常量的地址(类型{char * str =“String”}的定义被称为字符串常量。将Ans字符串常量放入可执行文件中的.rodata部分),然后你'我会收到例外。
  • 如果您传递的是数组地址,(char arr [] =“String”),那么该函数将起作用。