Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在遍历字符串时更改字符会使程序崩溃_C++_Macos_Gcc - Fatal编程技术网

C++ 在遍历字符串时更改字符会使程序崩溃

C++ 在遍历字符串时更改字符会使程序崩溃,c++,macos,gcc,C++,Macos,Gcc,可能重复: 有人能指出以下程序中的问题吗: #include <stdio.h> int main() { char *c = "Hello World!! !!"; char c2 = 'X'; while(c) { if(*c == ' ') { printf("%s",c); *c = c2; } c++; } re

可能重复:

有人能指出以下程序中的问题吗:

#include <stdio.h>

int main()
{
    char *c = "Hello World!! !!";
    char c2 = 'X';
    while(c)
    {
        if(*c == ' ')
        {
            printf("%s",c);
            *c = c2;
        }
        c++;
    }
    return 0;
}
我在MacOSX上将GCC用作编译器,将Eclipse用作IDE。

在代码中,c指向字符串文字。第*c=c2行尝试修改字符串文字,即。未定义行为的一种可能表现形式是,字符串文本被放入只读内存中,您会得到一个或类似的值

如果您按以下方式更改代码,它应该可以工作:

char arr[] = "Hello World!! !!";
char* c = arr;
现在c指向一个数组。与字符串文字不同,允许修改数组的内容

最后,while循环的条件是指针的值,而不是指针指向的值。您正在查找空终止符“\0”。应该是这样的:

while (*c)
{
    ...
    c++;
}
在代码中,c指向字符串文字。第*c=c2行尝试修改字符串文字,即。未定义行为的一种可能表现形式是,字符串文本被放入只读内存中,您会得到一个或类似的值

如果您按以下方式更改代码,它应该可以工作:

char arr[] = "Hello World!! !!";
char* c = arr;
现在c指向一个数组。与字符串文字不同,允许修改数组的内容

最后,while循环的条件是指针的值,而不是指针指向的值。您正在查找空终止符“\0”。应该是这样的:

while (*c)
{
    ...
    c++;
}
当你这样做的时候:char*c=你好,世界!!;然后c是指向内存的指针 这在代码部分,所以您不能更改它

但是如果你有字符c[]=你好,世界!!;然后c是堆栈上的字符数组,因此您可以更改它

在这种情况下,最好这样做:char const*c=Hello World!!;因为这样,如果您在进行更改时尝试更改字符串,您的程序将不会崩溃,它将出现编译器错误,并且不会运行程序,这会更好。

当您这样做时:char*c=Hello World!!;然后c是指向内存的指针 这在代码部分,所以您不能更改它

但是如果你有字符c[]=你好,世界!!;然后c是堆栈上的字符数组,因此您可以更改它


在这种情况下,最好这样做:char const*c=Hello World!!;因为这样,如果您尝试在执行操作时更改字符串,您的程序不会崩溃,它将出现编译器错误,并且不会运行程序,这会更好。

@NPE请保留指向未定义行为维基页面的链接…@NPE请保留指向未定义行为维基页面的链接。。。