为什么最后无法输出?是指针使用得不对吗(关键词-#include)

为什么无法输出?

#include<stdio.h>
int main()
{
    int n = 0;//学生人数
    int k = 0;//第k名学生
    char num[][10] = {"\0"};//存放学号,如90777001
    char(*pnum)[10];
    pnum = num;
    double grade[101] = { 0 };//存放成绩<=100
    double* p = NULL;
    p = grade;
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%s %lf", &num[i][10], &grade[i]);
    }
    for (int i = 0; i < n - 1; i++)//对成绩从高到低排序
    {
        for (int j = 0; j < n - 1; j++)
        {
            if ((*p+j) < (*p+j+1))
            {
                double temp = (*p+j);
                grade[j] = (*p+j+1);
                grade[j+1] = temp;

                char s = (*pnum+j)[10];
                num[j][10] = (*pnum + j + 1)[10];
                num[j][10] = s;
            }
        }
    }
    printf("%s %g", (*pnum + k - 1), (*p + k - 1));//输出第k名学生的学号和成绩
    return 0;
}

img

【以下回答由 GPT 生成】

问题出在代码的指针使用上有一些错误。下面是具体的问题和解决方案:

  1. 在这行代码中:scanf("%s %lf", &num[i][10], &grade[i]);,应该将&num[i][10]改为num[i],因为num是一个二维字符数组,而不是一个指向字符数组的指针。所以应该改为:scanf("%s %lf", num[i], &grade[i]);

  2. 在排序部分的代码中,排序算法部分没有问题,但是在交换成绩和学号时的代码有问题。应该使用中间变量对成绩和学号进行交换,而不是直接赋值。对应的代码应该是: ```c double temp = (p + j); (p + j) = (p + j + 1); (p + j + 1) = temp;

char s[10]; strcpy(s, (pnum + j)); strcpy((pnum + j), (pnum + j + 1)); strcpy((pnum + j + 1), s); ```

注意:为了在排序算法中使用指针,可以使用指针间接访问数组元素。例如,对于grade数组,可以使用*(p + j)来访问元素,而对于num数组,可以使用*(pnum + j)来访问元素。

下面是修改后的代码:

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

int main()
{
    int n = 0; //学生人数
    int k = 0; //第k名学生
    char num[][10] = {"\0"}; //存放学号,如90777001
    char(*pnum)[10];
    pnum = num;
    double grade[101] = {0}; //存放成绩<=100
    double* p = NULL;
    p = grade;
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%s %lf", num[i], p + i);
    }
    for (int i = 0; i < n - 1; i++) //对成绩从高到低排序
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (*(p + j) < *(p + j + 1))
            {
                double temp = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = temp;

                char s[10];
                strcpy(s, *(pnum + j));
                strcpy(*(pnum + j), *(pnum + j + 1));
                strcpy(*(pnum + j + 1), s);
            }
        }
    }
    printf("%s %g", *(pnum + k - 1), *(p + k - 1)); //输出第k名学生的学号和成绩
    return 0;
}

现在代码应该能够正确输出第k名学生的学号和成绩。



【相关推荐】



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

char num[][10] = {"\0"};
编译器不知道你的num有多大,这个根据输入的n动态分配。

引用 皆我百晓生 小程序回复内容作答:
程序无法输出的原因是在排序部分的代码中,交换学号和成绩时的赋值操作有误。

首先是成绩的交换,应该是:

double temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;

然后是学号的交换,应该是:

char temp[10];
strcpy(temp, pnum[j]);
strcpy(pnum[j], pnum[j+1]);
strcpy(pnum[j+1], temp);

另外,scanf函数中的%s和%lf格式控制符中不需要使用取地址符&,正确的写法应该是:

scanf("%s %lf", num[i], &grade[i]);

修正后的代码如下:

#include<stdio.h>
int main()
{
    int n = 0;//学生人数
    int k = 0;//第k名学生
    char num[101][10] = {"\0"};//存放学号,如90777001
    char (*pnum)[10];
    pnum = num;
    double grade[101] = { 0 };//存放成绩<=100
    double* p = NULL;
    p = grade;
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%s %lf", num[i], &grade[i]);
    }
    for (int i = 0; i < n - 1; i++)//对成绩从高到低排序
    {
        for (int j = 0; j < n - 1; j++)
        {
            if (p[j] < p[j + 1])
            {
                double temp = p[j];
                p[j] = p[j + 1];
                p[j + 1] = temp;

                char temp[10];
                strcpy(temp, pnum[j]);
                strcpy(pnum[j], pnum[j + 1]);
                strcpy(pnum[j + 1], temp);
            }
        }
    }
    printf("%s %g", pnum[k - 1], p[k - 1]);//输出第k名学生的学号和成绩
    return 0;
}