如何通过 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);
我一整天都在尝试解决这个问题,但我自己无法解决。网上搜索也没有解决
所以,这个函数原型:
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);