反向 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 还有更多要补充