[英]How to return char 2D array double pointer in C
#include<stdio.h>
#define MAX_LEN 20
char *swap_elements(char **arr, int i)
{
char temp[5];
*temp = *arr;
*arr = *(arr+i);
*(arr+i) = *temp;
return arr;
}
void main()
{
char arr[][MAX_LEN]={"user1", "user2", "user3", "user4"};
int i, j;
printf("Enter the index with which you want to swap: ");
scanf("%d", &i);
arr = swap_elements(arr, i);
for(j=0;j<4;j++)
printf("%s", *(arr+i));
}
这是我编写的用于将第一个元素与用户输入的索引元素交换的代码。 但它显示如下错误
对于符合 C 标准的启动器,不带参数的 function main 应声明如下
int main( void )
在这个function电话
arr = swap_elements(arr, i);
数组指示符arr
被隐式转换为指向其第一个类型为char ( * )[MAX_LEN]
的元素的指针。
另外 arrays 没有赋值运算符。 所以这个说法
arr = swap_elements(arr, i);
是不正确的。
您需要像这样声明 function
void swap_elements( char ( *arr )[MAX_LEN], int i);
在 function 中,您试图将指针分配给 object 类型的char
char temp[5];
*temp = *arr;
那没有道理。
相反,您需要复制存储在字符 arrays 中的字符串。
function可以这样定义
#include <string.h>
void swap_elements( char ( *arr )[MAX_LEN], int i)
{
char temp[MAX_LEN];
strcpy( temp, *arr );
strcpy( *arr, *( arr + i );
strcpy( *( array + i ), temp );
}
另一种方法是声明一个指针数组而不是多维数组。
例如
char * arr[] = {"user1", "user2", "user3", "user4"};
在这种情况下,function 看起来像
void swap_elements( char **arr, int i)
{
char *temp;
temp = *arr;
*arr = *( arr + i );
*( array + i ) = temp;
}
注意需要在function内部检查传递的索引不大于数组大小。 否则 function 是不安全的。 因此,您需要向 function 添加一个参数,该参数将指定传递的数组中的元素数。
这是实际实现您想要做的事情的方法。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 20
void swap_elements(char* arr, int i)
{
char temp[MAX_LEN];
strncpy(temp, arr, MAX_LEN);
strncpy(arr, arr+i*MAX_LEN, MAX_LEN);
strncpy(arr+i*MAX_LEN, temp, MAX_LEN);
}
void main()
{
char arr[][MAX_LEN]={"user1", "user2", "user3", "user4"};
int swapTarget;
printf("Enter the index with which you want to swap: ");
scanf("%d", &swapTarget);
swap_elements(arr, swapTarget);
for(int i=0;i<4;i++)
printf("%s", arr[i]);
}
要理解我为什么这样做首先你需要理解多维 arrays 是如何存储在 C 中的。
例如,当您拥有此数组时:
int arr2d[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,10}}
它将像这样存储:
| 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 |
当您尝试使用arr2d[1][1]
C 访问第二个数组第二个元素时,基本上会将其转换为: *(arr2d + 1*2 + 1)
。 2 此处代表子数组之一的大小(在您的情况下MAX_LEN
)。
因此,当我编写arr+i*MAX_LEN
时,它与编写arr[i]
相同,但您必须手动执行。
你也不能像这样移动字符串*arr = *(arr+i)
。 这只会将 arr 的第 i 个字符移动到 arr 的第一个字符的位置。
这就是为什么您必须使用strcpy
或strncpy
的原因。 不同之处在于,使用strncpy
定义要移动的字符串的长度,而使用strcpy
则它复制直到达到空字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.