尝试反转字符串时发生分段错误

Segmentation fault occuring when trying reverse a string

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

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

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

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

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

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] != '[=12=]' ) ++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] != '[=14=]' ) ++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;
}