繁体   English   中英

如何在 C 中返回 char 二维数组双指针

[英]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 的第一个字符的位置。

这就是为什么您必须使用strcpystrncpy的原因。 不同之处在于,使用strncpy定义要移动的字符串的长度,而使用strcpy则它复制直到达到空字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM