首页 > 解决方案 > 如何交换二维数组中的两行

问题描述

要交换普通 char 数组中的两个元素,我知道这个函数会起作用

void swap(char str[],int i, int j){
    char c=str[i];
    str[i]=str[j];
    str[j]=c;
}

我用二维数组尝试了类似的东西,但是得到了这个语句“错误:赋值给数组类型的表达式”。这是我尝试使用的功能。

void swap(char name[][31],int i,int j){
    char hold[31];
    hold=name[i];
    name[i]=name[j];
    name[j]=hold;
}

我对编码真的很陌生,在我进入高等教育机构之前,我正在尝试自己学习。

我想弄清楚如何编写一个函数来交换二维数组中的两行。

标签: c

解决方案


您有正确的想法,即在传输两个数组行时使用相同类型的保持变量来包含中间结果,但首先要解决一些问题:

正如评论中提到的,hold不需要是一个数组。这个简单的修复将允许您的函数在循环中被调用。这是一个稍作修改的示例,以说明您的函数以及如何调用它:

int main(void)
{
    char names[][31] = {{"THIS STRING IS UPPER CASE"},{"this string is lower case"}}; 

    for(int i = 0;i<sizeof(names[0])/sizeof(names[0][0]);i++)
    {
        swap(names, i, i);//must be called in loop to complete swap
    }
}    
//swaps one char per call and returns    
void swap(char name[][31],int i,int j)
{
    char hold;
    
    hold=name[0][i];
    name[0][i]=name[1][j];
    name[1][j]=hold;
}

关于风格
的建议 为了提高效率、可读性和可维护性,通常最好将与函数相关的尽可能多的工作转移到函数本身中。在这种情况下,swap通过更改参数列表并将循环移动到函数中,而不是循环 31 次,它可以被调用一次,并且仍然提供所需的结果。

以下是您的方法的示例,但适用于在内部完成所有工作。注意参数列表的更改。

//adaptation of original method with internal looping
void swap1(char **str)
{
    int len = strlen(str[0]);//same len, test one.
    
    char hold = 0;
    
    for(int i = 0;i < len;i++)
    {
        hold = str[0][i];
        str[0][i] = str[1][i];
        str[1][i] = hold;
    }        
}

并且,根据评论中的建议,如果 char 数组are each\0` 终止,则它们有资格作为一对 C 字符串,允许使用字符串函数strcpy()通过消除循环需要来简化。

//using strcpy() to simplify swap 
void swap2(char **str)
{
    int len = strlen(str[0]);//same len, test one.
    
    char hold[len+1];
    
    strcpy(hold, str[0]);
    strcpy(str[0], str[1]);
    strcpy(str[1], hold);
}

最后,以下显示了用于两种变体的新调用方法:

void swap1(char **str);//char by char
void swap2(char **str);//use strcpy()

int main(void)
{  
    //char name[2][80] = {{"name1IsLongerThan2"}, {"Name2IsShorter"}};
    char *name1 = "name1IsLongerThan2";
    char *name2 = "Name2IsShorter    ";//Note for this example, 
                                       //both strings must be same length
    char *name[] = {name1, name2};
    
    swap1(name);
    printf("name 1: %s\nname 2: %s\n", name[0], name[1]);
    swap2(name);
    printf("name 1: %s\nname 2: %s\n", name[0], name[1]);

    return 0;
}

推荐阅读