如何通过 C 中的函数反转字符串数组中的每个字符串?

How to reverse every string in an array of strings through a function in C?

我一整天都在尝试解决这个问题,但我自己无法解决。网上搜索也没有解决

所以,这个函数原型:

void invert(char **arr, int n);

第一个参数是字符串数组,第二个参数是数组中的字符串数。

这是我的代码:

#include <stdio.h>
#include <string.h>
void invert(char** arr, int n)
{
    int i, j, len;
        for(j=0;j<n;j++)
        {
            len=strlen(arr[j]);
             for(i=0;i<len/2;i++)
                {
                    char tmp = arr[j][i];             
                    arr[j][i] = arr[j][len - i - 1]; 
                    arr[j][len - i - 1] = tmp; 
                }
        }
}
int main()
{
    int n=3, i;
    char **arr;
    arr[0]="John";
    arr[1]="Doe";
    arr[2]="Programmer";
    invert(arr, n);
    for(i=0;i<3;i++)
    {
        printf("%s ",arr[i]);
    }
}

代码在到达行时中断:

arr[j][i] = arr[j][len - i - 1];

而且我不明白为什么。 该函数完美地接收了一个字符串数组(针对特定字符串的字符用一些 printf 语句对其进行了测试),并且 char tmp 成功地接收了一个正确的字符,但是程序在到达前面提到的那一行时崩溃了。该行之后的 Printf 语句不起作用。

我错过了什么吗?有人可以解释我做错了什么吗?谢谢!

对于初学者来说,这个代码片段

char **arr;
arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

调用未定义的行为,因为指针 arr 未初始化且具有不确定的值。

此外,这种方法在任何情况下都是错误的,因为您不能更改字符串文字。

你需要声明一个two-dimensional数组,例如

enum { N = 11 };

//...

char arr[3][N] =
{
    "John", "Doe", "Programmer"
};

在这种情况下,函数声明如下所示

void invert( char arr[][N], int n );

枚举必须在函数声明之前声明。

您可以声明一个指针数组,而不是 two-dimensional 数组,例如

char s1[] = "John";
char s2[] = "Doe";
char s3[] = "Programmer";
char * arr[3] = { s1, s2, s3 };

在这种情况下,函数声明可能如您的问题所示

void invert(char** arr, int n)

因此,您需要做的是用最少的更改替换此代码片段

char **arr;
arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

对于此代码段

char s1[] = "John";
char s2[] = "Doe";
char s3[] = "Programmer";
char * arr[3] = { s1, s2, s3 };

首先,您拥有的是:

   char **arr;

是指向char的指针。

其次,即使您有一个 指向 char 的指针数组,像这样 :

char *arr[3];

然后分配每个字符串文字 :

arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

仍会调用未定义的行为,因为您正在尝试modify a string literal,这是只读

你需要的是 二维字符数组 :

char arr[][100] = {"John", "Doe", "Programmer"};

并将函数签名更改为:

void invert(char arr[][100], int n)

或者您必须动态分配内存并使用 strcpy(), strdup(), memcpy() 等函数:

char **arr;

arr = malloc(n * sizeof(char *)); // or sizeof(*arr)

if (arr == NULL) {
    fprintf(stderr, "Malloc failed to allocate memory\n");
    exit(1);
}

arr[0] = strdup("John"); // good idea to also check if strdup returned null
arr[1] = strdup("Doe");
arr[2] = strdup("Programmer");

invert(arr, n);
for(i=0;i<3;i++)
{
    printf("%s ",arr[i]);
}

for (i = 0; i < 3; i++) {
    free(arr[i]);
}

free(arr);