【问题标题】:Reverse a string in c [duplicate]反转c中的字符串[重复]
【发布时间】:2013-03-20 19:59:57
【问题描述】:

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

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'

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

【问题讨论】:

  • 这个问题已经被问过很多次了:stackoverflow.com/questions/11538381/reverse-strings-in-c
  • @cacho:这个问题问的是一个完全不同的问题(代码恰好想要完成相同的任务,但以不同的方式)。另一个问题的代码没有就地反转,错误是不同的......基本上,这里给出的解决方案完全不相关。
  • 没错,但我的问题是字符串文字,我无法通过您的链接找到它。
  • 对不起,下次我会努力搜索更好的。

标签: c string reverse


【解决方案1】:

reverseStr 中的代码没问题,问题出在调用代码上。您几乎可以肯定将字符串文字或其他一些只读内存传递给函数。

您的调用代码很可能是:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 2019-05-19
        • 2017-06-21
        相关资源
        最近更新 更多