Aommm 发表于 2023-7-16 14:22:25

结构体定义问题请教

结构体初学,打印时,在黑窗口输入时会出问题无法正常打印,请问哪里出错了??

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

struct student {
        int num;
        char name;
        char sex;
        int age;
        float score;
        char addr ;
};

        int main()
{
               
                struct student sarr;
                int i;
                for (i = 0; i < 3; i++)
                {
                        scanf("%d%s %c%d%f%s",&sarr.num,sarr.name,&sarr.sex,&sarr.age,&sarr.score,sarr.addr);
                }
                for (i = 0; i < 3; i++)
                {
                        printf("%d %s %c %d %5.2f %s\n", sarr.num, sarr.name, sarr.sex, sarr.age, sarr.score, sarr.addr);
                }
                return 0;
}

陶远航 发表于 2023-7-16 14:22:41

在你提供的代码中,存在一个问题导致无法正常打印结构体数据。问题出在 scanf 函数调用中,对于 %s 格式化符号,它需要一个字符数组的地址作为参数。然而,在你的代码中,你没有给出 sarr.name 和 sarr.addr 对应的地址,而是直接传递了数组名。

要修复这个问题,你需要使用 & 运算符获取数组的地址。修改 scanf 函数调用中的参数为 &sarr.name 和 &sarr.addr。

以下是修复后的代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

struct student {
    int num;
    char name;
    char sex;
    int age;
    float score;
    char addr;
};

int main() {
    struct student sarr;
    int i;

    for (i = 0; i < 3; i++) {
      scanf("%d%s %c%d%f%s", &sarr.num, sarr.name, &sarr.sex, &sarr.age,
            &sarr.score, sarr.addr);
    }

    for (i = 0; i < 3; i++) {
      printf("%d %s %c %d %5.2f %s\n", sarr.num, sarr.name, sarr.sex,
               sarr.age, sarr.score, sarr.addr);
    }

    return 0;
}


通过在 scanf 函数调用中使用 & 运算符来获取数组地址,你应该能够正常打印结构体数据了。希望这可以解决你的问题!

isdkz 发表于 2023-7-16 14:25:56

你的代码看起来已经非常好了,其定义和使用结构体都没有问题。不过,如果你在输入时遇到了问题,可能的原因是你在使用scanf函数获取输入时数据的格式出错了。

你的scanf调用如下:

scanf("%d%s %c%d%f%s",&sarr.num,sarr.name,&sarr.sex,&sarr.age,&sarr.score,sarr.addr);


根据这个scanf格式字符串,你应该按照下面的顺序和格式输入数据:

1. 一个整数(例如,101)。
2. 不含空格的一个字符串(例如,张三)。
3. 一个字符(例如,M)。
4. 一个整数(例如,20)。
5. 一个浮点数(例如,98.5)。
6. 不含空格的一个字符串(例如,北京)。

每个数据之间应该用空格分隔。

举个例子,你的输入应该是类似这样的:

101 张三 M 20 98.5 北京


你的scanf语句在读取name和addr字段时,不能处理含有空格的字符串。如果你的输入中的这些字段包含空格,可能就会出现问题。

注意: scanf函数中的%s格式化符号是以空格、制表符或换行符作为字符串结束的标志的,所以无法读取含有空格的字符串。

如果你的输入数据中的name或addr可能会包含空格,你需要使用其他的读取方式,例如fgets函数。然而, fgets会把换行符也读进来,因此需要额外处理这个换行符。

Aommm 发表于 2023-7-16 14:26:08

陶远航 发表于 2023-7-16 14:22
在你提供的代码中,存在一个问题导致无法正常打印结构体数据。问题出在 scanf 函数调用中,对于 %s 格式化 ...

定义时给sarr.name 和 sarr.addr定义成了数组,数组名存的不就是起始地址嘛,所以调用scanf时,是不是可以直接写数组名而不用写&呢?

Aommm 发表于 2023-7-16 14:32:49

isdkz 发表于 2023-7-16 14:25
你的代码看起来已经非常好了,其定义和使用结构体都没有问题。不过,如果你在输入时遇到了问题,可能的原因 ...

超级感谢!{:10_254:}
页: [1]
查看完整版本: 结构体定义问题请教