张邦焱 发表于 2021-3-16 12:49:31

结构体

#include<stdio.h>
struct student
{
        int xuehao;
        char name;
        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;
}
直能输入第一个学生学号、姓名和成绩,第二个输入不了。

wp231957 发表于 2021-3-16 13:12:31

第一你没有循环语句
第二你没有申请结构体数组
第三你没有申请空间

jackz007 发表于 2021-3-16 13:57:47

#include <stdio.h>

struct student
{
      int xuehao    ;
      char name ;
      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>

张邦焱 发表于 2021-3-16 14:11:24

#include<stdio.h>
struct student
{
        int xuehao;
        char name;
        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;
        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里面加“,”就出问题。

海-啵啵鱼 发表于 2021-3-16 14:27:10

我在code blocks里面运行程序是没有问题的,但是你肯定是在VS里面运行的,建议你把读取姓名的单独拿出来写一个scanf_s("%s",30,a.name);

jackz007 发表于 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() 的格式描述符越简洁越好,最好不要出现任何分隔符,否则,各种 "怪现象" 总是会不期而至。

海-啵啵鱼 发表于 2021-3-16 14:44:20

struct student
{
        int xuehao;
        char name;
        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申请内存空间

张邦焱 发表于 2021-3-16 16:06:28

海-啵啵鱼 发表于 2021-3-16 14:44
struct student
{
        int xuehao;


嗯嗯好嘞

han125416866 发表于 2021-3-18 14:36:37

{:5_106:}
页: [1]
查看完整版本: 结构体