反向 c 样式字符串
reverse c style string
我知道这个问题已经被问过很多次了,但我完全卡住了。
编辑:这个问题与之前的问题不同,因为问题不在于反向函数的代码,而是什么类型的值可以传递给反向函数(即数组与指针).. 看下面的答案以获取更多信息。
我只是想反转 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 has stopped working"。
我尝试在 while 循环中放置一个 print 语句来尝试调试并查看发生了什么。它在 windows 弹出窗口出现之前到达 while 循环一次。
编辑:阅读评论后我也尝试将 main 中的代码更改为:
char string[] = "foobar";
reverse(string);
当我这样做时,我的程序就会挂起。
我做错了什么?
谢谢!
char *string = "foobar";
这里 string
是指向 characters.You 序列的指针,不能使用 string
修改值 foobar
。例如试试这个
string[1]='p';//will throw error
而在您的 reverse()
中,您确实在 this.Use 这样做
char string[]="foobar"; //and now you can modify it
string[1]='p';//wiil work
所以 reverse()
也可以。
您的代码问题与这部分有关char *string = "foobar";
这里 "foobar" 存储在内存位置, string 保存 "foobar"[ 的第一个位置=35=] 所以基本上现在 string 表现为 const 所以你不能改变它的内容。
您可以这样做 char string[] = "foobar";
。
编辑:正如@jonathan-leffler 提到的,我忘了提及内存位置。
char *string = "foobar";
存储在数据段中,该数据段在编译时被赋予内存,并试图在运行时修改它会给你一个段错误。
然而,
char string[] = "foobar";
存储在堆栈中,可以修改。
EDIT2:阅读下面的评论@jonathan-leffler 还有更多要补充
我知道这个问题已经被问过很多次了,但我完全卡住了。
编辑:这个问题与之前的问题不同,因为问题不在于反向函数的代码,而是什么类型的值可以传递给反向函数(即数组与指针).. 看下面的答案以获取更多信息。
我只是想反转 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 has stopped working"。 我尝试在 while 循环中放置一个 print 语句来尝试调试并查看发生了什么。它在 windows 弹出窗口出现之前到达 while 循环一次。
编辑:阅读评论后我也尝试将 main 中的代码更改为:
char string[] = "foobar";
reverse(string);
当我这样做时,我的程序就会挂起。
我做错了什么?
谢谢!
char *string = "foobar";
这里 string
是指向 characters.You 序列的指针,不能使用 string
修改值 foobar
。例如试试这个
string[1]='p';//will throw error
而在您的 reverse()
中,您确实在 this.Use 这样做
char string[]="foobar"; //and now you can modify it
string[1]='p';//wiil work
所以 reverse()
也可以。
您的代码问题与这部分有关char *string = "foobar";
这里 "foobar" 存储在内存位置, string 保存 "foobar"[ 的第一个位置=35=] 所以基本上现在 string 表现为 const 所以你不能改变它的内容。
您可以这样做 char string[] = "foobar";
。
编辑:正如@jonathan-leffler 提到的,我忘了提及内存位置。
char *string = "foobar";
存储在数据段中,该数据段在编译时被赋予内存,并试图在运行时修改它会给你一个段错误。
然而,
char string[] = "foobar";
存储在堆栈中,可以修改。
EDIT2:阅读下面的评论@jonathan-leffler 还有更多要补充