C中的就地字符串反转

我正在尝试学习C的基础知识,但我无法弄清楚为什么这段代码不起作用。 reverse()中的while循环导致总线错误。 我在编程采访书中发现了几乎完全相同的代码作为有效的解决方案,但是我在这里发布的这个或其他类似的方法都没有发生总线错误。

#include  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; } 

问题是你试图反转一个只读的常量文字字符串。 将main的声明更改为char a[] = "12"; 把它变成一个可写的char数组

您正在尝试更改导致未定义行为的字符串文字。

更改

 char* a = "12"; 

 char a[] = "12"; 

因为endstr指向相同的内存位置 – >它们是同一对象的两个不同名称。 您可以避免使用两个变量:

 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; }