我想要反转一个字符串,但我在swap char上出错了。
有人可以帮我这个吗?
char* reverse_char(char* src){
char *p,*q;
p = q = src;
while(*(p) != '\0'){
p++;
}
p--;
char temp = '\0';
while (p > q) {
temp = *p;
*p = *q; // I got exec bad access here ??? why
*q = temp;
p--;
q++;
}
return src;
}
这是主要方法。
int main(int argc, char const* argv[])
{
char *hi = "hello world!\n";
printf("%s", hi);
reverse_char(hi);
printf("%s", hi);
return 0;
}
答案 0 :(得分:5)
将char *hi = "hello world!\n";
替换为char hi[] = "hello world!\n";
"hello world!\n"
是字符串文字,可能无法写入导致访问错误。修改字符串文字的内容是未定义的行为,它可能会静默写入内容,引发访问错误或者可能会执行其他意外操作。 (所以你不应该写字符串文字)
总结
char a[] = "..."; /* Contents of a can be assigned */
char *a = "..."; /* Writing to contents of memory pointed by a leads to UB */
答案 1 :(得分:2)
尽管C中的字符串文字具有非常量字符数组的类型,但它们可能不会更改。
来自C标准(6.4.5字符串文字)
7未指明这些阵列是否与它们不同 元素具有适当的值。 如果程序尝试 修改这样的数组,行为是未定义的。
最好将使用字符串文字初始化的指针声明为类型const char *
,就像在C ++中完成一样。例如
const char *hi = "hello world!\n";
在这种情况下,您将得到一个可以理解的编译时错误而不是运行时错误,因为该函数的参数被声明为非const字符指针。
您必须使用字符数组而不是指向字符串文字的指针。
例如
char hi[] = "hello world!\n";
当指针指向空字符串时,它有一些问题的功能。在这种情况下操作后
p--;
你可以得到无效的指针,这个指针不必小于src。
我会按照以下方式编写函数
char* reverse_string( char *s )
{
char *p = s;
while ( *p ) ++p;
if ( p != s )
{
for ( char *q = s; q < --p; ++q )
{
char c = *q;
*q = *p;
*p = c;
}
}
return s;
}