www^^ 发表于 2023-9-19 19:57:49

指针与函数与数组

题目:
/*输入5个国家英文名,然后按字母表顺序排序后输出*/
char *name(char *array[],int n)
{
    char *p1,*p2;
        for(int i=0;i<n;i++)
        {
                for(int j=0;j<n;j++)
                {
               
                if(array>array)
                {
                        p1=array;
                        array=array;
                        array=p1;
                }
                }
               
                return array;

        }
}

int main()
{
        char *a_name;
        for(int i=0;i<5;i++)
        {
                scanf("%s",a_name);
        }
        name(*a_name,5);
                for(int i=0;i<5;i++)
        {
                printf("%s",a_name);
        }
       
}
错误提示:cannot convert 'char*' to 'char**' for argument '1' to 'char* name(char**, int)'

想问问这个问题怎么解决,因为这个代码运行不了,想问问大家这个代码逻辑上还有什么错误没有?

谢谢大家!!!

isdkz 发表于 2023-9-19 19:57:58

这个程序有两个问题需要解决。

第一个问题是函数参数类型不匹配。函数定义中的第一个参数是指向指针的指针,但是在调用函数时传递的是一个指向指针数组的指针。可以将函数定义中的第一个参数改为指向指针数组的指针,即将 "char *array[]" 改为 "char **array"。

第二个问题是函数返回值的位置错误。在函数内部,应该在所有循环结束后返回排序后的字符串数组。但是在这个程序中,return语句放在了循环内部,导致只排序了一个元素就返回了。可以将return语句移动到循环外部。

下面是修改后的程序:

#include <stdio.h>
#include <string.h>

void sort_names(char **names, int n)
{
    char *temp;
    for (int i = 0; i < n - 1; i++) {
      for (int j = i + 1; j < n; j++) {
            if (strcmp(names[ i], names) > 0) {
                temp = names[ i];
                names[ i] = names;
                names = temp;
            }
      }
    }
}

int main()
{
    char names;
    for (int i = 0; i < 5; i++) {
      scanf("%s", names[ i]);
    }
    sort_names(names, 5);
    for (int i = 0; i < 5; i++) {
      printf("%s\n", names[ i]);
    }
    return 0;
}


这个程序首先在主函数中读入5个字符串,然后调用sort_names函数进行排序,最后输出排序后的结果。排序函数中使用了strcmp函数进行字符串比较,如果第一个字符串大于第二个字符串,则交换它们的位置。

liuhongrun2022 发表于 2023-9-19 21:01:55

在您提供的代码中,有几个问题需要解决:

1. 函数声明和函数定义不一致:
   在主函数 main() 中调用的 name() 函数的声明和定义不一致。在函数声明和定义时,参数 array 的类型应为 char 。将函数声明修改如下:
      char *name(char *array[], int n);
   

2. 不正确的数组定义和传递:
   在主函数 main() 中,定义数组 a_name 的方式不正确。应该将 char *a_name 修改为 char a_name,以声明一个包含 5 个字符串的二维字符数组。
   同时,在调用 name() 函数时,应该传递数组名 a_name,而不是 *a_name。将代码修改如下:
      name(a_name, 5);
   

3. 缺少头文件:
   您的代码中缺少了 <stdio.h> 和 <string.h> 头文件,它们分别用于输入输出和字符串操作。请确保将它们添加到代码中。

综上所述,以下是修改后的代码:

#include <stdio.h>
#include <string.h>

void sort_names(char names, int n) {
    char *temp;
    for (int i = 0; i < n - 1; i++) {
      for (int j = i + 1; j < n; j++) {
            if (strcmp(names, names) > 0) {
                temp = names;
                names = names;
                names = temp;
            }
      }
    }
}

int main() {
    char names;
    for (int i = 0; i < 5; i++) {
      scanf("%s", names);
    }
    sort_names(names, 5);
    for (int i = 0; i < 5; i++) {
      printf("%s\n", names);
    }
    return 0;
}


这样,您应该能够正确运行并按字母顺序排序输出输入的国家英文名。请注意,修改后的代码使用了 sort_names 函数来对字符串数组进行排序,并且传递的参数类型和数组定义都进行了修正。

此内容为ChatGPT(AI)回答,若有错误多多包涵,如果对你有帮助,请设置一个最佳答案!

桃花飞舞 发表于 2023-9-26 14:25:33

本帖最后由 桃花飞舞 于 2023-9-26 14:31 编辑

char *name(char *array[],int n) 这里返回值类型是char *型的函数,
你是想返回字符串的首地址,其实不用返回首地址,在主函数中的数组地址传进去就行了,可以在主函数再定义一个name_tmp;
来传入函数中存放排序好的地址,这样就不用返回地址了。函数就是char name(char *array[],int n)这样.
另外主函数中char *a_name;这是指向二维数组的指针,相当于三维了.没必要这样。改为
char a_name;
页: [1]
查看完整版本: 指针与函数与数组