【问题标题】:Reverse string function gives me a segmentation fault反向字符串函数给了我一个分段错误
【发布时间】:2013-02-03 23:01:19
【问题描述】:

我正在复习我的 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;
    }
}

这个解决方案也给了我同样的段错误:

#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;
        }
    }
}

【问题讨论】:

  • 您不能修改文字。现在我已经给出了有用的建议,当你在实际代码中反转字符串时,请注意std::reverse
  • 你需要展示你的作品。比如分段错误发生在哪一行?
  • 谢谢,@chris,我知道std::reverse,但我试图用 C 风格来做到这一点。

标签: c++ segmentation-fault


【解决方案1】:
char *str = "hello mofo!";

str 是字符串字面量,默认为const,更改为未定义行为,您需要这样:

char str[] = "hello mofo!";

【讨论】:

  • char *str = "hello mofo!"; const char *str = "hello mofo!"; 不同。此外,由于历史原因,字符串文字的类型为 char []not const char []
  • @H2CO3:不符合标准工作草案中的2.14.5/8。
  • @H2CO3:正确的char *str = "hello mofo!";const char *str = "hello mofo!"; 不同。第二个版本是正确的。第一个版本依赖于已弃用的 C++“特性”。它没有改变底层类型的类型,但确实改变了指针类型,因此使用 C 库并不痛苦。但是导致了这个问题未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
相关资源
最近更新 更多