【问题标题】:Segmentation fault occuring when trying reverse a string [closed]尝试反转字符串时发生分段错误[关闭]
【发布时间】:2021-01-21 02:25:40
【问题描述】:

所以我有这个函数应该反转一个字符串然后返回它

char *my_revstr(char *str)
{
    int i = 0;
    int j = 0;
    int k = 0;

    while(str[j] != '\0') {
        j++;
    }
    j--;
    while(i < j) {
        k = str[i];
        str[i] = str[j];
        str[j] = k;
        i++;
        j--;
    }
    return (str);
}

但是每当我尝试运行它时,我都会遇到分段错误,老实说,我不太清楚为什么。我希望有人能帮我解决这个问题^^。

【问题讨论】:

标签: c reverse c-strings string-literals function-definition


【解决方案1】:

我确信你有一个分段错误,因为向函数传递了类似的字符串文字

my_revstr( "Hello" );

您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

你应该这样写

char s[] = "Hello";
my_revstr( s );

注意变量 i 和 j 应该是 size_t 类型,因为 int 类型可能不足以存储字符串的大小。

函数可以定义如下,如下面的演示程序所示,

#include <stdio.h>

char * my_revstr( char *s )
{
    size_t n = 0;

    while ( s[n] != '\0' ) ++n;

    if ( n != 0 )
    {
        for ( size_t i = 0; i < --n; ++i )
        {
            char c = s[n];
            s[n] = s[i];
            s[i] = c;
        }
    }

    return s;
}

int main(void) 
{
    char s[] = "Hello";
    
    puts( s );
    puts( my_revstr( s ) );

    return 0;
}

程序输出是

Hello
olleH

函数也可以定义如下方式

char * my_revstr( char *s )
{
    size_t n = 0;

    while ( s[n] != '\0' ) ++n;

    for ( size_t i = 0; i < n / 2; ++i )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s;
}

或者您可以使用指针来实现该功能。例如

char * my_revstr( char *s )
{
    char *first = s, *last = s;

    while ( *last ) ++last;

    if ( first != last )
    {
        for ( ; first < --last; ++first )
        {
            char c = *first;
            *first = *last;
            *last = c;
        }
    }

    return s;
}

【讨论】:

  • 如果我们想在技术上不必要地迂腐,应该说你“不应该”修改字符串文字。导致未定义行为的事情并没有被禁止,它们只会让程序变得毫无意义。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2011-03-11
  • 2015-07-22
  • 2011-09-03
  • 2019-09-20
相关资源
最近更新 更多