鱼C论坛

 找回密码
 立即注册
查看: 890|回复: 4

[已解决]结构体定义问题请教

[复制链接]
发表于 2023-7-16 14:22:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

struct student {
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30] ;
};

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

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

你的  scanf  调用如下:
scanf("%d%s %c%d%f%s",&sarr[i].num,sarr[i].name,&sarr[i].sex,&sarr[i].age,&sarr[i].score,sarr[i].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  会把换行符也读进来,因此需要额外处理这个换行符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-16 14:22:41 | 显示全部楼层
在你提供的代码中,存在一个问题导致无法正常打印结构体数据。问题出在 scanf 函数调用中,对于 %s 格式化符号,它需要一个字符数组的地址作为参数。然而,在你的代码中,你没有给出 sarr[i].namesarr[i].addr 对应的地址,而是直接传递了数组名。

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

以下是修复后的代码示例:
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>struct student {    int num;    char name[20];    char sex;    int age;    float score;    char addr[30];};int main() {    struct student sarr[3];    int i;    for (i = 0; i < 3; i++) {        scanf("%d%s %c%d%f%s", &sarr[i].num, sarr[i].name, &sarr[i].sex, &sarr[i].age,              &sarr[i].score, sarr[i].addr);    }    for (i = 0; i < 3; i++) {        printf("%d %s %c %d %5.2f %s\n", sarr[i].num, sarr[i].name, sarr[i].sex,               sarr[i].age, sarr[i].score, sarr[i].addr);    }    return 0;}
通过在 scanf 函数调用中使用 & 运算符来获取数组地址,你应该能够正常打印结构体数据了。希望这可以解决你的问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-16 14:25:56 | 显示全部楼层    本楼为最佳答案   
你的代码看起来已经非常好了,其定义和使用结构体都没有问题。不过,如果你在输入时遇到了问题,可能的原因是你在使用  scanf  函数获取输入时数据的格式出错了。

你的  scanf  调用如下:
scanf("%d%s %c%d%f%s",&sarr[i].num,sarr[i].name,&sarr[i].sex,&sarr[i].age,&sarr[i].score,sarr[i].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  会把换行符也读进来,因此需要额外处理这个换行符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

定义时给sarr.name 和 sarr.addr定义成了数组,数组名存的不就是起始地址嘛,所以调用scanf时,是不是可以直接写数组名而不用写&呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

超级感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表