gpt4 book ai didi

C:将可变长度的二维数组转换为一维字符串

转载 作者:行者123 更新时间:2023-11-30 16:51:15 30 4
gpt4 key购买 nike

考虑一个 char** 类型的二维数组。该数组的行数(子字符串数)有限,但列长度可变(子字符串长度可变)。

我想创建一个函数,该函数将此数组和行数(子字符串)作为参数,并返回由每个有序子字符串(行)组成的单个字符串。它是一个简单的串联。这是与此 question 相反的行为.

我编写了以下代码来执行此操作,但仅当每个子字符串长度相同(恒定列长度)时才有效,因此我将最大列长度作为函数参数传递:

char* cat2dCharMat(char** A, int m, int n){

char* temp = malloc((m*n+1));
int length = 0;
for(int i = 0; i < m;++i){
memcpy(&temp[n*i], A[i],strlen(A[i]));
length += (int)strlen(A[i]);
}
temp[length] = '\0';
printf("Length of concatenated string is %d chars.\n",strlen(temp));
return temp;
}

如何使其更通用以适应许多列长度?我还编写了一个 main() 来配合此函数,以获得完整的、最小的、可验证的示例(原谅二维数组初始化——我发现使用 array = {"hello", "world!"} 不起作用):

int main(void){
char** array2 = (char**)malloc((3)*sizeof(char*));
for(int i = 0; i < 3; ++i){
array2[i] = (char*)malloc(4*sizeof(char));
for(int j = 0; j < 3;++j){
if(j==0 && i==0)
array2[i][j] = '0';
else if(j==1 && i==0)
array2[i][j] = '8';
else if(j==2 && i==0)
array2[i][j] = '7';
else if(j==0 && i==1)
array2[i][j] = '4';
else if(j==1 && i==1)
array2[i][j] = '9';
else if(j==2 && i==1)
array2[i][j] = '5';
}
}
char** array1 = (char**)malloc((3)*sizeof(char*));
for(int i = 0; i < 3; ++i){
if(i == 0){
array1[i] = malloc(4);
for(int j = 0; j < 3;++j){
if(j==0 && i==0)
array1[i][j] = '0';
else if(j==1 && i==0)
array1[i][j] = '8';
else if(j==2 && i==0)
array1[i][j] = '7';
}
}else{
array1[i] = malloc(5);
for(int j = 0; j < 4;++j){
if(j==0 && i==0)
array1[i][j] = '0';
else if(j==1 && i==1)
array1[i][j] = '8';
else if(j==2 && i==1)
array1[i][j] = '7';
else if(j==3 && i==1)
array1[i][j] = '7';
}
}
}
array1[0][3] = '\0';
array1[1][4] = '\0';
char* array1cat = cat2dCharMat(array1,2,4);
char* array2cat = cat2dCharMat(array2,2,3);
printf("Testing cat2dCharMat()...\n\n");
printf("Case 1: {\"087\",\"495\"}\n");
printf("Expected Result: 087495\n");
printf("Actual Result: %s\n", array2cat);
printf("Case 2:{\"087\",\"0877\"}\n");
printf("Expected Result: 0870877\n");
printf("Actual Result: %s\n", array1cat);
}

最佳答案

我不太理解您希望函数使用的第二个参数(“行数(子字符串)”),因此这里有一个想法,将“数组”的第一个字符串连接起来(这不是一个数组, C: differences between char pointer and array )

请注意,它根本不是一个安全函数,因为它不会检查您赋予 n 的值对于您的变量来说不是太大(它会引发段错误);在您自己的代码中实现您自己的函数时请注意这一点。

char * concatenate_these_strings (char ** my_strings ,unsigned int n){
int i,size = 1;
for ( i=0 ; i<n ; i++){
size += strlen (my_strings[i]);
}
char * my_result = malloc (size);
for ( i=0 ; i<n ; i++){
strcat (my_result,my_strings[i]);
}
return my_result;
}

关于C:将可变长度的二维数组转换为一维字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41838200/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com