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

问题描述

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

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

但是,每当我尝试运行它时,我都会遇到细分错误,并且说实话,我也不知道为什么。我希望有人可以帮助我解决此问题^^。

解决方法

我确定由于将类似的字符串文字传递给函数而导致分段错误

> install.packages("~/Downloads/data.table-master.zip")
Warning message:
package ‘~/Downloads/data.table-master.zip’ is not available (for R version 3.6.3) 

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

你应该这样写

my_revstr( "Hello" );

请注意,变量i和j的类型应为char s[] = "Hello"; my_revstr( s ); ,因为类型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;
}