鱼C论坛

 找回密码
 立即注册
查看: 1515|回复: 8

[已解决]结构体

[复制链接]
发表于 2021-3-16 12:49:31 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
struct student
{
        int xuehao;
        char name[30];
        float chengji;
}a,b;
int main()
{
        printf("请输入第一个学生的学号、姓名和成绩:\n");
        scanf_s("%d,%s,%f", &a.xuehao, a.name, &a.chengji);  //name是字符串不用&
        printf("请输入第二个学生的学号、姓名和成绩:\n");
        scanf_s("%d,%s,%f", &b.xuehao, b.name, &b.chengji);  //name是字符串不用&

        if (a.chengji>b.chengji)
                printf("%d\t%s\t%f\n",a.xuehao,a.name,a.chengji);
        else if (a.chengji<b.chengji)
                printf("%d\t%s\t%f\n",b.xuehao,b.name,b.chengji);
        else
        {
                printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
                printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
        }
        return 0;
}
直能输入第一个学生学号、姓名和成绩,第二个输入不了。
最佳答案
2021-3-16 14:30:56
本帖最后由 jackz007 于 2021-3-16 14:32 编辑
张邦焱 发表于 2021-3-16 14:11
#include
struct student
{


      你认为输入项之间的逗号是分隔符,但是,格式描述符 "%s" 会首先把它识别成字符串的内容,它一定会把 name + ',' + chengji 输入给 name,而 chengji 则无法获得输入,这就是问题所在。所以,作为经验,scanf() 的格式描述符越简洁越好,最好不要出现任何分隔符,否则,各种 "怪现象" 总是会不期而至。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-16 13:12:31 From FishC Mobile | 显示全部楼层
第一你没有循环语句
第二你没有申请结构体数组
第三你没有申请空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 13:57:47 | 显示全部楼层
#include <stdio.h>

struct student
{
        int xuehao    ;
        char name[30] ;
        float chengji ;
} a , b               ;

int main(void)
{
        printf("请输入第一个学生的学号、姓名和成绩:")                       ;
        scanf_s("%d%s%f" , & a . xuehao, a . name ,30 , & a .chengji)        ; // scanf_s() 在读取字符串的时候,必须提供字符串存储空间长度参数
        printf("请输入第二个学生的学号、姓名和成绩:")                       ;
        scanf_s("%d%s%f" , & b . xuehao, b . name ,30 , & b .chengji)        ; // scanf_s() 在读取字符串的时候,必须提供字符串存储空间长度参数
        if(a . chengji > b . chengji) {
                printf("%d\t%s\t%f\n" , a . xuehao , a . name , a . chengji) ;
        } else if(a . chengji < b . chengji) {
               printf("%d\t%s\t%f\n" , b . xuehao , b . name , b . chengji)  ;
        } else {
               printf("%d\t%s\t%f\n", a . xuehao , a . name , a . chengji)   ;
               printf("%d\t%s\t%f\n", b . xuehao , b . name , b . chengji)   ;
        }
        return 0                                                             ;
}
        编译、运行实况
D:\0002.Exercise\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.28.29334 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

D:\0002.Exercise\C>x
请输入第一个学生的学号、姓名和成绩:101 abc 99
请输入第二个学生的学号、姓名和成绩:102 bcd 65
101     abc     99.000000

D:\0002.Exercise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 14:11:24 | 显示全部楼层
#include<stdio.h>
struct student
{
        int xuehao;
        char name[30];
        float chengji;
}a, b;
int main()
{
        printf("请输入第一个学生的学号、姓名和成绩:\n");
        scanf_s("%d%s%f", &a.xuehao, a.name,30, &a.chengji);  //name是字符串不用&
        printf("请输入第二个学生的学号、姓名和成绩:\n");
        scanf_s("%d%s%f", &b.xuehao, b.name,30, &b.chengji);  //name是字符串不用&

        if (a.chengji>b.chengji)
                printf("%d\t%s\t%f\n",a.xuehao,a.name,a.chengji);
        else if (a.chengji<b.chengji)
                printf("%d\t%s\t%f\n",b.xuehao,b.name,b.chengji);
        else
        {
                printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
                printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
        }
        return 0;
}


/*#include <stdio.h>
struct student
{
        int xuehao;
        char name[30];
        float chengji;
} a, b;

int main(void)
{
        printf("请输入第一个学生的学号、姓名和成绩:");
        scanf_s("%d%s%f", &a.xuehao, a.name, 30, &a.chengji); // scanf_s() 在读取字符串的时候,必须提供字符串存储空间长度参数
        printf("请输入第二个学生的学号、姓名和成绩:");
        scanf_s("%d%s%f", &b.xuehao, b.name, 30, &b.chengji); // scanf_s() 在读取字符串的时候,必须提供字符串存储空间长度参数
        if (a.chengji > b.chengji) {
                printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
        }
        else if (a.chengji < b.chengji) {
                printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
        }
        else {
                printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
                printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
        }
        return 0;
}*/


scanf_s("%d%s%f", &a.xuehao, a.name, 30, &a.chengji);
scanf_s("%d,%s,%f", &a.xuehao, a.name, 30, &a.chengji);
scanf_s()l里面加“,”就出问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 14:27:10 | 显示全部楼层
我在code blocks里面运行程序是没有问题的,但是你肯定是在VS里面运行的,建议你把读取姓名的单独拿出来写一个scanf_s("%s",30,a.name);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 14:30:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-3-16 14:32 编辑
张邦焱 发表于 2021-3-16 14:11
#include
struct student
{


      你认为输入项之间的逗号是分隔符,但是,格式描述符 "%s" 会首先把它识别成字符串的内容,它一定会把 name + ',' + chengji 输入给 name,而 chengji 则无法获得输入,这就是问题所在。所以,作为经验,scanf() 的格式描述符越简洁越好,最好不要出现任何分隔符,否则,各种 "怪现象" 总是会不期而至。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 14:44:20 | 显示全部楼层
struct student
{
        int xuehao;
        char name[30];
        float chengji;
}a, b;
int input_info()
{
        printf("请输入第一个学生的学号、姓名和成绩:\n");
        scanf_s("%d ", &a.xuehao);  //name是字符串不用&
        scanf_s("%s",a.name, 30);
        scanf_s("%f", &a.chengji);



        printf("请输入第二个学生的学号、姓名和成绩:\n");
        scanf_s("%d ", &b.xuehao);  //name是字符串不用&
        scanf_s("%s", b.name, 30);
        scanf_s("%f", &b.chengji);

        if (a.chengji > b.chengji)
                printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
        else if (a.chengji < b.chengji)
                printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
        else
        {
                printf("%d\t%s\t%f\n", a.xuehao, a.name, a.chengji);
                printf("%d\t%s\t%f\n", b.xuehao, b.name, b.chengji);
        }
        return 0;
}

int main()
{
           input_info();
           return 0;
}

这样亲测有效了,scanf_s这个函数有点特别,在VS中的话一般输入字符串还是单独拿出来输入吧,不会出错
另外,不知道你学指针了没有,如果学习了的话,建议是自己申请内存来存储信息,使用malloc申请内存空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 16:06:28 | 显示全部楼层
海-啵啵鱼 发表于 2021-3-16 14:44
struct student
{
        int xuehao;

嗯嗯  好嘞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-18 14:36:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 17:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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