C语言程序纠错,请问哪儿有错误

题目从键盘任意输入某班10个学生的成绩(成绩类型为整型),保存到数组中,并输出成绩由高到低的排序结果。
(提高:输入学生数n,用malloc申请对应的存储空间存放学生成绩(用指向整型数据的指针实现),然后对成绩进行排序)

img


对么

你的程序不符合题意啊,要用malloc,你没有用

int a[10];
修改为
int *a = (int *)malloc(sizeof(int) * 10);
在结尾加上
free(a);

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7487399
  • 除此之外, 这篇博客: C语言子函数返回二维数组讨论中的 这里可以通过Malloc函数,开辟内存空间,将数组地址就可以通过子函数来进行返回,在主函数中进行遍历了。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <stdio.h>
    #include <stdlib.h>
    
    char ** Function1()
    {
    	char **Arr = NULL;
    	char i = 0, j = 0;
    	char Brr[3][3] = {"123", "456", "789"};
    
    	Arr = (char **)malloc(sizeof(char *) * 3);
    	for (i = 0; i < 3; i++)
    	{
    		Arr[i] = (char *)malloc(sizeof(char) * 3);
    		for (j = 0; j < 3; j++)
    		{
    			Arr[i][j] = Brr[i][j];
    		}
    	}
    	return Arr;
    }
    
    int main(int argc, const char *argv[])
    {
    	char **p = NULL;	
    	int i = 0, j = 0;
    
    	p = Function1();
    	printf ("Arr[0][0] = %c\n", *(*p));			// 1
    	printf ("Arr[0][1] = %c\n", *(*(p) + 1));	// 2
    	printf ("Arr[0][2] = %c\n", *(*(p) + 2));	// 3
    
    	printf ("Arr[1][0] = %c\n", *(*(p + 1)));		    // 4
    	printf ("Arr[1][1] = %c\n", *(*(p + 1) + 1));    // 5
    	printf ("Arr[1][2] = %c\n", *(*(p + 1) + 2));	// 6
    
    	printf ("Arr[2][0] = %c\n", *(*(p + 2)));		    // 7
    	printf ("Arr[2][1] = %c\n", *(*(p + 2) + 1));	// 8
    	printf ("Arr[2][2] = %c\n", *(*(p + 2) + 2));	// 9
        // 将保存每一行的指针先释放掉
    	for (i = 0; i < 3; i++)
    	{
    		if (*(p + i) != NULL)
    		{
    			free (*(p + i));
    			*(p + i) = NULL;
    			printf ("free *(p + %d) success!!!\n", i);
    		}
    	}
    	// 最后将保存整个二维数组的指针释放掉
    	if (p != NULL)
    	{
    		free (p);
    		printf ("free p success!!!\n");
    	}
    	return 0;
    }
    
  • 以下回答来自chatgpt:

    该代码没有明显错误,可以正确地输入10个学生成绩并按照从高到低排序输出。

    如果要改善该代码,可以考虑以下几点:

    1. 输入校验: 在输入学生成绩时,可以对每个输入做校验,确保输入的是合法的整数,避免非法输入导致程序异常退出。

    2. 错误处理: 使用动态内存分配时,需要考虑内存分配失败的情况,并给出相应的错误提示。

    3. 函数封装: 在代码较为复杂时,可以把功能相似的代码封装成函数,提高代码的可读性和复用性。

    以下是对上述改进点的实现示例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int* get_grades(int n);
    void bubble_sort(int* arr, int n);
    void print_grades(int* arr, int n);
    
    int main() {
        int n = 10;
        int* grade = get_grades(n);
    
        bubble_sort(grade, n);
    
        printf("成绩从高到低排列为:\n");
        print_grades(grade, n);
    
        free(grade);
        return 0;
    }
    
    int* get_grades(int n) {
        int* grade = (int*)malloc(sizeof(int) * n);
        if (grade == NULL) {        // 内存分配失败
            printf("内存分配失败\n");
            exit(-1);
        }
    
        printf("请输入%d个学生的成绩:\n", n);
        for (int i = 0; i < n; i++) {
            char input[256];        // 定义字符数组
            int j = 0;
            scanf("%s", input);     // 接收字符串
            while (input[j]) {      // 判断每个字符是否都是数字
                if (!isdigit(input[j])) {
                    printf("输入有误,请重新输入:\n");
                    scanf("%s", input);   // 再次接收字符串
                    j = 0;           // 从头开始检查
                }
                else {
                    j++;
                }
            }
            grade[i] = atoi(input);  // 字符串转为整数
        }
    
        return grade;
    }
    
    void bubble_sort(int* arr, int n) {
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j] < arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
    
    void print_grades(int* arr, int n) {
        for (int i = 0; i < n; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^