问题描述
这里主要是我在处理二维字符串数组排序过程中突发奇想想到使用自定义函数去实现字符串数组排序的功能,但是在实现过程中遇到了这样的问题:“该如何传参才能把主函数中的二维字符串数组传到自定义函数中并将结果返回到主函数中?”我首先想到的是用字符指针,但是字符指针想了半天也没整出来,所以通过查阅相关资料找出了正确做法之一。如果还有其他正确做法,请各位大佬指出!
解决办法
void sort(char strs[][8]){
char temp[8];
for(int i=0;i<9;i++){
for(int j=i+1;j<9;j++){
if(strcmp(strs[i],strs[j])>0)
{
strcpy(temp,strs[i]);
strcpy(strs[i],strs[j]);
strcpy(strs[j],temp);
}
}
}
}
自定义函数中的形参(char strs[][8])要和主函数中的char strs[9][8]保持大小一致。
原因解释如下:
在C语言中,数组作为函数参数时,会退化为指针。因此,当你将二维字符数组(即字符串数组)strs
传递给sort
函数时,实际上传递的是该数组的首地址。
函数原型void sort(char strs[][8])
中的char strs[][8]
实际上被解释为char (*strs)[8]
,即指向大小为8的字符数组的指针。因此,函数内部对strs
的修改实际上是对原始数组的直接修改,而不是对副本的修改。
在sort
函数中,通过比较字符串(使用strcmp
函数)并交换字符串(使用strcpy
函数)来对字符串数组进行排序。由于直接操作的是原始数组的地址,所以这些更改在函数返回后仍然有效。
因此,当sort
函数返回时,main
函数中的strs
数组已经被排序,所以后续打印出的字符串数组是排序后的结果。
总结:字符串数组在函数中的传参类型是“指向字符数组的指针”,并且由于直接修改了原始数据,因此在函数调用结束后,这些更改仍然有效。
题目描述
本关任务:有一个字符串数组包含9
个字符串,每个字符串都是一个单词,且每个串的长度均不超过7
,要求对单词进行排序后再输出。
具体要求如下:
1.
使用二维字符数组存放这9
个字符串。
2.
为二维字符数组输入数据。
3.
输出处理前和处理后的字符串数组并进行比较。
输入: 9
个字符串,长度小于7
。
输出: 打印输出处理前的9
个字符串。 打印输出处理后的9
个字符串。
测试输入:
she
its
can
ibm1
bbc
NBA
nhk2
BOY
jxf
预期输出:
排序前的字符串:
she
its
can
ibm1
bbc
NBA
nhk2
BOY
jxf
排序后的字符串:
BOY
NBA
bbc
can
ibm1
its
jxf
nhk2
she
完整代码
#include<stdio.h>
#include<string.h>
void sort(char strs[][8]){
char temp[8];
for(int i=0;i<9;i++){
for(int j=i+1;j<9;j++){
if(strcmp(strs[i],strs[j])>0)
{
strcpy(temp,strs[i]);
strcpy(strs[i],strs[j]);
strcpy(strs[j],temp);
}
}
}
}
int main() {
// 定义一个字符串数组
char strs[9][8];
char temp[8];
for(int i=0;i<9;i++){
scanf("%s",strs[i]);
}
printf("排序前的字符串:\n");
for(int i=0;i<9;i++){
printf("%s\n",strs[i]);
}
sort(strs);
// 输出排序后的字符串数组
printf("排序后的字符串:\n");
for (int i = 0; i < 9; i++) {
printf("%s\n", strs[i]);
}
return 0;
}