我知道这个问题已被多次询问,但我完全陷入困境。
编辑:这个问题与之前的问题有所不同,因为问题不在于反向函数的代码,而是可以将哪些类型的值传递给反向函数(即数组与指针)。请参阅下面的答案了解更多信息。我只是试图反转c风格的字符串。我已经复制并粘贴了代码,直接来自Cracking the Coding Interview。 (见下文)
void reverse(char *str) {
char * end = str;
char tmp;
if (str) {
while (*end) {
++end;
}
--end;
while (str < end) {
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}
这对我不起作用。我是C的新手,所以也许我编写错误的代码。我的主要功能如下:
int main(int argc, char *argv[])
{
char *string = "foobar";
reverse(string);
printf("%s\n", string);
return 0;
}
我在Windows 8.1中使用Cygwin,在我运行的命令行上使用:
gcc ex1.c -Wall -o exe1
./exe1
每次我从Windows上弹出“exe1.exe已停止工作”。 我尝试在while循环中放置一个print语句来尝试调试并查看发生了什么。它会在窗口弹出之前到达while循环。
编辑:在阅读完评论后,我也尝试将主要代码更改为:
char string[] = "foobar";
reverse(string);
当我这样做时,我的程序就会挂起。
我做错了什么?
谢谢!
答案 0 :(得分:4)
您的代码存在的问题与此部分有关char *string = "foobar";
此处&#34; foobar&#34; 存储在内存位置,字符串包含&#34; foobar&#34; 所以基本上现在字符串表现为 const ,因此您无法更改其内容。
您可以改为char string[] = "foobar";
。
编辑:正如@ jonathan-leffler所提到的,我忘了提及内存位置。
char *string = "foobar";
存储在数据段中,该数据段在编译期间被给予内存,并且在运行时尝试修改它将为您提供Seg Fault。
而,
char string[] = "foobar";
存储在堆栈中并可以修改。
EDIT2:阅读以下评论@ jonathan-leffler还有更多要添加的内容
答案 1 :(得分:1)
char *string = "foobar";
此处string
是指向一系列字符的指针。您无法使用foobar
修改值string
。例如,试试这个
string[1]='p';//will throw error
并且在你的reverse()
中你正是这样做的。请改为使用
char string[]="foobar"; //and now you can modify it
string[1]='p';//wiil work
所以reverse()
也可以。