调用函数时,用指针传递二维数组

在这段代码中,在对high【】【】,low【】【】的每一行进行字符串排序时,我想用指针作形参,发现函数参数传递过程中出现错误,我捋不清了,求求帮忙改一下sort的函数声明,和函数调用

#include 
#include 
#include 
void sort(char *str,int len);
void get_score(int b[],int flag,char a[],int len);
int main()
{
    int n,i;
    scanf("%d",&n);
    int b[n];
    getchar();
    char str[n][50],tmp[50];
    for(i=0;igets(str[i]);
        b[i]=-1;
        str[i][strlen(str[i])]='\0';
        if(isdigit(str[i][strlen(str[i])-1])==0);
        else{
            strcpy(tmp,str[i]);
            get_score(b,i,tmp,strlen(str[i]));
        }
    }
    
    int min=100,max=0;
    for(int k=0;kif(maxif((min>b[k])&&(b[k]>=0))
        min=b[k];
    }
    char high[10][50];
    char low[10][50];
    int num_high=0,num_low=0;
    
    for(int k=0;kif(b[k]==max)
        strcpy(high[num_high++],str[k]);
        if(min==b[k])
        strcpy(low[num_low++],str[k]);
    }
    if(min==max){
        printf("%s\n",low);
        return 0; 
    }
    
    sort(high[0],num_high);
    sort(low[0],num_low);
    printf("%s\n",high[0]);
    printf("%s\n",low[num_low-1]);
    return 0;
    
}
void get_score(int b[],int flag,char a[],int len)
{
    int num=0;
    int j;
    for(j=len;;j--){
        if(isspace(a[j-1]))
        break;
    }
    while(j10;
        num+=a[j++]-'0';
    }
    a[j]='\0';
    b[flag]=num;
}
void sort(char *str,int len)
{
    char ttmp[50];
    for(int m=0;m-1;m++){
        for(int e=0;e-1-m;e++){
            if(strcmp(*(str+e*50),*(str+(e+1)*50))>0){
                strcpy(ttmp,*(str+e*50));
                strcpy(*(str+e*50)],*(str+(e+1)*50));
                strcpy(*(str+(e+1)*50),ttmp);
            }
        }
    }//sort
}

得将参数改为指针数组才行

#include <stdio.h>
#include <string.h>
#include <ctype.h>
void sort(char (*str)[50],int len);
void get_score(int b[],int flag,char a[],int len);
int main()
{
    int n,i;
    scanf("%d",&n);
    int b[n];
    getchar();
    char str[n][50],tmp[50];
    for(i=0;i<n;i++){
        gets(str[i]);
        b[i]=-1;
        str[i][strlen(str[i])]='\0';
        if(isdigit(str[i][strlen(str[i])-1])==0);
        else{
            strcpy(tmp,str[i]);
            get_score(b,i,tmp,strlen(str[i]));
        }
    }
    
    int min=100,max=0;
    for(int k=0;k<n;k++){
        if(max<b[k])
        max=b[k];
        if((min>b[k])&&(b[k]>=0))
        min=b[k];
    }
    char high[10][50];
    char low[10][50];
    int num_high=0,num_low=0;
    
    for(int k=0;k<n;k++){
        if(b[k]==max)
        strcpy(high[num_high++],str[k]);
        if(min==b[k])
        strcpy(low[num_low++],str[k]);
    }
    if(min==max){
        printf("%s\n",low);
        return 0; 
    }
    
    sort(high,num_high);
    sort(low,num_low);
    printf("%s\n",high[0]);
    printf("%s\n",low[num_low-1]);
    return 0;
    
}
void get_score(int b[],int flag,char a[],int len)
{
    int num=0;
    int j;
    for(j=len;;j--){
        if(isspace(a[j-1]))
        break;
    }
    while(j<len){
        num*=10;
        num+=a[j++]-'0';
    }
    a[j]='\0';
    b[flag]=num;
}
void sort(char (*str)[50],int len)
{
    char ttmp[50];
    for(int m=0;m<len-1;m++){
        for(int e=0;e<len-1-m;e++){
            if(strcmp(*(str+e),*(str+e+1))>0){
                strcpy(ttmp,*(str+e));
                strcpy(*(str+e),*(str+e+1));
                strcpy(*(str+e+1),ttmp);
            }
        }
    }//sort
}

给定的代码存在几个问题。

首先,使用gets()读取输入是危险的,因为它不检查输入字符串的长度并且可能导致缓冲区溢出。建议使用更安全的替代方法,例如fgets()instead。

其次,sort()功能实现不正确。该函数被传递一个指向字符串数组的第一个元素的指针,但它尝试使用语法访问数组的元素,就好像它们是二维数组一样*(str+e*50)。这将导致错误,因为数组的元素实际上是大小为 50 的一维字符数组。此外,函数strcpy()内部的调用sort()也使用了不正确的语法,因为它们缺少目标参数。更正后的实现sort()可能如下所示:

void sort(char str[][50], int len) {
    // 定义一个临时变量,用于交换两个字符串的位置
    char tmp[50];

    // 外层循环控制排序轮数
    for (int i = 0; i < len - 1; i++) {
        // 内层循环控制每轮比较的次数
        for (int j = 0; j < len - i - 1; j++) {
            // 如果前一个字符串比后一个字符串大,则交换这两个字符串的位置
            if (strcmp(str[j], str[j+1]) > 0) {
                // 交换两个字符串的位置
                strcpy(tmp, str[j]);
                strcpy(str[j], str[j+1]);
                strcpy(str[j+1], tmp);
            }
        }
    }
}

第三,代码使用该isdigit()函数来检查字符串是否以数字结尾。但是,此函数仅适用于单个字符,不适用于字符串。相反,应该使用数组索引直接检查字符串的最后一个字符,如下所示:

if (isdigit(str[i][strlen(str[i]) - 1])) {
    strcpy(tmp, str[i]);
    get_score(b, i, tmp, strlen(str[i]));
}

最后,当最高分和最低分相同时,程序输出最低分。但是,提示并没有指定在这种情况下输出哪个字符串,所以不清楚这种行为是否正确。