在这段代码中,在对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]));
}
最后,当最高分和最低分相同时,程序输出最低分。但是,提示并没有指定在这种情况下输出哪个字符串,所以不清楚这种行为是否正确。