反向c样式字符串

时间:2015-04-20 06:41:11

标签: c string pointers cygwin

我知道这个问题已被多次询问,但我完全陷入困境。

编辑:这个问题与之前的问题有所不同,因为问题不在于反向函数的代码,而是可以将哪些类型的值传递给反向函数(即数组与指针)。请参阅下面的答案了解更多信息。

我只是试图反转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);

当我这样做时,我的程序就会挂起。

我做错了什么?

谢谢!

2 个答案:

答案 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()也可以。