Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++_Segmentation Fault - Fatal编程技术网

C++ 反向字符串函数给了我一个分段错误

C++ 反向字符串函数给了我一个分段错误,c++,segmentation-fault,C++,Segmentation Fault,我正在温习我的C/C++技能。我试图实现一个反转字符串的函数,但每次运行程序时都会出现分段错误(内核转储) #include <stdio.h> #include <string.h> void revstr(char *str); int main() { char *str = "hello mofo!"; revstr(str); puts(str); return 0; } void revstr(char *str) {

我正在温习我的C/C++技能。我试图实现一个反转字符串的函数,但每次运行程序时都会出现分段错误(内核转储)

#include <stdio.h>
#include <string.h>

void revstr(char *str);

int main()
{
    char *str = "hello mofo!";
    revstr(str);
    puts(str);

    return 0;
}

void revstr(char *str)
{
    int start = 0;
    int len = strlen(str);
    int mid = len / 2;
    int i, t;
    printf("start: %d, mid: %d,len: %d\n", start, mid, len);

    for ( i = start; i < mid; ++i )
    {
        printf("str[%d] swapping to str[%d]: %c, %c\n", i, len - 1 -i, str[i], str[len - 1 - i]);
        t = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = t;
    }
}
#包括
#包括
void revstr(char*str);
int main()
{
char*str=“你好,莫福!”;
revstr(str);
put(str);
返回0;
}
void revstr(char*str)
{
int start=0;
int len=strlen(str);
int-mid=len/2;
int i,t;
printf(“开始:%d,中间:%d,长度:%d\n”,开始,中间,长度);
对于(i=开始;i
此解决方案也给了我相同的seg故障:

#include <stdio.h>
#include <string.h>

void revstr(char *str);

int main()
{
    char *str = "hello mofo!";
    revstr(str);
    puts(str);

    return 0;
}

void revstr(char *str)
{
    char *end = str;
    char t;
    if ( str )
    {
        while ( *end != 0 )
            end++;
        end--;

        while ( str < end )
        {
            t = *str;
            *str++ = *end;
            *end-- = t;
        }
    }
}
#包括
#包括
void revstr(char*str);
int main()
{
char*str=“你好,莫福!”;
revstr(str);
put(str);
返回0;
}
void revstr(char*str)
{
char*end=str;
查尔特;
如果(str)
{
而(*end!=0)
end++;
结束--;
while(str
str
是字符串文字,默认为
const
,将其更改为未定义行为,您希望改为:

char str[] = "hello mofo!";
str
是字符串文字,默认为
const
,将其更改为未定义行为,您希望改为:

char str[] = "hello mofo!";

不能修改文字。既然我已经给出了有用的建议,那么在实际代码中反转字符串时要注意
std::reverse
。您需要展示您的工作。例如,分段错误发生在哪一行?谢谢,@chris,我知道
std::reverse
,但我试着用C风格来做。你不能修改文字。既然我已经给出了有用的建议,那么在实际代码中反转字符串时要注意
std::reverse
。您需要展示您的工作。例如,分段错误发生在哪一行?谢谢,@chris,我知道
std::reverse
,但我试着用C风格来做这件事
与const char*str=“你好,mofo!”不同。此外,由于历史原因,字符串文字的类型为
char[]
而不是
const char[]
。@H2CO3:不符合标准工作草案中的2.14.5/8。@H2CO3:Correct
char*str=“hello mofo!”
与const char*str=“你好,mofo!”不同。第二个版本是正确的。第一个版本依赖于一个不被推荐的“C++”特性。它没有更改基础类型的类型,但更改了指针类型,因此使用C库并不痛苦。但导致此问题的是未定义的行为。
char*str=“hello mofo!”
与const char*str=“你好,mofo!”不同。此外,由于历史原因,字符串文字的类型为
char[]
而不是
const char[]
。@H2CO3:不符合标准工作草案中的2.14.5/8。@H2CO3:Correct
char*str=“hello mofo!”
与const char*str=“你好,mofo!”不同。第二个版本是正确的。第一个版本依赖于一个不被推荐的“C++”特性。它没有更改基础类型的类型,但更改了指针类型,因此使用C库并不痛苦。但是导致这个问题的是未定义的行为。