c - 如何交换二维数组中的两行
问题描述
要交换普通 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;
}
我对编码真的很陌生,在我进入高等教育机构之前,我正在尝试自己学习。
我想弄清楚如何编写一个函数来交换二维数组中的两行。
解决方案
您有正确的想法,即在传输两个数组行时使用相同类型的保持变量来包含中间结果,但首先要解决一些问题:
正如评论中提到的,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;
}
推荐阅读
- excel - 如何编写一个多条件索引匹配来平均所有出现的结果
- omnet++ - 尝试使用 INET 引用创建新项目,在 .msg 文件中得到:“unexpected NAME,expecting $end”
- python - TypeError:需要字符串或类似字节的对象
- python-3.x - 在 try 语句中使用 .isalnum()
- c# - 如何向特定服务器地址发送 http 请求
- kendo-grid - 如何将网格中的变量绑定到同一网格中另一列中的另一个变量?
- android - 具有多个应用程序的 Android R 命名空间
- c# - 如何在c#或sql中从具有不同条件的同一张表中获取公共数据
- neo4j - 从/向不同版本的 Neo4j 转储和恢复数据
- javascript - 雷达图 显示图例