user-0 提问: c语言结构体练习第二个学生信息没办法输入姓名直接跳到性别了

回复:
user: user-0
content: 引用 6 楼 自信男孩的回复:scanf_s("%d", &a); 这个是%d格式输入，输入1之后，a是1，而不是'1'，明白了吗？  可以吧case '1'改成case 1试试。  也可以把%d改成%c，但是这种改法比较麻烦，因为在这条scanf_s之前还得加一条getchar(); 建议用上一种方法，case 1 知道了，谢谢，还是到了内存问题，基础没打严实

user: user-1
content: scanf_s("%d", &a); 这个是%d格式输入，输入1之后，a是1，而不是'1'，明白了吗？  可以吧case '1'改成case 1试试。  也可以把%d改成%c，但是这种改法比较麻烦，因为在这条scanf_s之前还得加一条getchar(); 建议用上一种方法，case 1

user: user-0
content: 引用 4 楼 Gnglas的回复:[quote=引用 3 楼 自信男孩的回复:]#include<stdio.h> int main() {     struct Studens     {         char name[60];         char gender[5];         int studen_number;         float grade;     }studen1,studen2;     puts("录入first学生信息：");     puts("");     printf("学生名字:");     fgets(studen1.name, 60, stdin);     puts(" ");     printf("学生性别:");     fgets(studen1.gender, 5, stdin);     puts(" ");     printf("学号：");     scanf_s("%d", &studen1.studen_number);     puts(" ");     printf("输入学生成绩：");     scanf_s("%f", &studen1.grade);     puts("");     puts("录入second学生信息：");     puts("");     getchar();    //for '\n'     printf("学生名字:");     fgets(studen2.name, 60, stdin);     puts(" ");     printf("学生性别:");     fgets(studen2.gender, 5, stdin);     puts(" ");     printf("学号："); scanf_s("%d", &studen2.studen_number);     puts(" ");     printf("输入学生成绩："); scanf_s("%f", &studen2.grade);     printf("是否比较两个学生的成绩：");     printf("是按1\t否按2\n");     int a;     scanf_s("%d", &a);     switch (a)     {         case '1':             if (studen1.grade > studen2.grade)             {                 printf("名字：%s\n性别：%s\n学号：%d\n成绩:%.2f\n", studen1.name, studen1.gender, studen1.studen_number, studen1.grade);              }             if(studen1.grade < studen2.grade)             {                 printf("名字：%s\n性别：%s\n学号：%d\n成绩:%.2f\n", studen2.name, studen2.gender, studen2.studen_number, studen2.grade);              }break;           default:printf("滚吧"); break;     }     return 0; }  加一条语句:getchar();如上代码。  因为fgets是遇到'\n'就会直接返回，由于输入完第一个学生信息时（最后一个学生信息用的是scanf_s）， '\n'还在输入缓存里，因此fgets遇到他直接返回了。  你可能会问，为什么fgets不会呢，因为fgets可能会把'\n'放到输入缓存里，比如输入name时，用的fgets 若输入的字符串小于60，那么会将'\n'存到name里，在'\0'之前，即前一个字符就是'\n'，若输入的字符 串大于等于59时，'\n'就不存在name里。  可以去网上查一下fgets和scanf_s 谢谢大佬，我知道了。。。。。。[/quote] 大佬还有个问题，switch好像也有问题，我输入1的时候直接调到最后输出"滚吧"

user: user-0
content: 引用 3 楼 自信男孩的回复:#include<stdio.h> int main() {     struct Studens     {         char name[60];         char gender[5];         int studen_number;         float grade;     }studen1,studen2;     puts("录入first学生信息：");     puts("");     printf("学生名字:");     fgets(studen1.name, 60, stdin);     puts(" ");     printf("学生性别:");     fgets(studen1.gender, 5, stdin);     puts(" ");     printf("学号：");     scanf_s("%d", &studen1.studen_number);     puts(" ");     printf("输入学生成绩：");     scanf_s("%f", &studen1.grade);     puts("");     puts("录入second学生信息：");     puts("");     getchar();    //for '\n'     printf("学生名字:");     fgets(studen2.name, 60, stdin);     puts(" ");     printf("学生性别:");     fgets(studen2.gender, 5, stdin);     puts(" ");     printf("学号："); scanf_s("%d", &studen2.studen_number);     puts(" ");     printf("输入学生成绩："); scanf_s("%f", &studen2.grade);     printf("是否比较两个学生的成绩：");     printf("是按1\t否按2\n");     int a;     scanf_s("%d", &a);     switch (a)     {         case '1':             if (studen1.grade > studen2.grade)             {                 printf("名字：%s\n性别：%s\n学号：%d\n成绩:%.2f\n", studen1.name, studen1.gender, studen1.studen_number, studen1.grade);              }             if(studen1.grade < studen2.grade)             {                 printf("名字：%s\n性别：%s\n学号：%d\n成绩:%.2f\n", studen2.name, studen2.gender, studen2.studen_number, studen2.grade);              }break;           default:printf("滚吧"); break;     }     return 0; }  加一条语句:getchar();如上代码。  因为fgets是遇到'\n'就会直接返回，由于输入完第一个学生信息时（最后一个学生信息用的是scanf_s）， '\n'还在输入缓存里，因此fgets遇到他直接返回了。  你可能会问，为什么fgets不会呢，因为fgets可能会把'\n'放到输入缓存里，比如输入name时，用的fgets 若输入的字符串小于60，那么会将'\n'存到name里，在'\0'之前，即前一个字符就是'\n'，若输入的字符 串大于等于59时，'\n'就不存在name里。  可以去网上查一下fgets和scanf_s 谢谢大佬，我知道了。。。。。。

user: user-1
content: #include<stdio.h> int main() {     struct Studens     {         char name[60];         char gender[5];         int studen_number;         float grade;     }studen1,studen2;     puts("录入first学生信息：");     puts("");     printf("学生名字:");     fgets(studen1.name, 60, stdin);     puts(" ");     printf("学生性别:");     fgets(studen1.gender, 5, stdin);     puts(" ");     printf("学号：");     scanf_s("%d", &studen1.studen_number);     puts(" ");     printf("输入学生成绩：");     scanf_s("%f", &studen1.grade);     puts("");     puts("录入second学生信息：");     puts("");     getchar();    //for '\n'     printf("学生名字:");     fgets(studen2.name, 60, stdin);     puts(" ");     printf("学生性别:");     fgets(studen2.gender, 5, stdin);     puts(" ");     printf("学号："); scanf_s("%d", &studen2.studen_number);     puts(" ");     printf("输入学生成绩："); scanf_s("%f", &studen2.grade);     printf("是否比较两个学生的成绩：");     printf("是按1\t否按2\n");     int a;     scanf_s("%d", &a);     switch (a)     {         case '1':             if (studen1.grade > studen2.grade)             {                 printf("名字：%s\n性别：%s\n学号：%d\n成绩:%.2f\n", studen1.name, studen1.gender, studen1.studen_number, studen1.grade);              }             if(studen1.grade < studen2.grade)             {                 printf("名字：%s\n性别：%s\n学号：%d\n成绩:%.2f\n", studen2.name, studen2.gender, studen2.studen_number, studen2.grade);              }break;           default:printf("滚吧"); break;     }     return 0; }  加一条语句:getchar();如上代码。  因为fgets是遇到'\n'就会直接返回，由于输入完第一个学生信息时（最后一个学生信息用的是scanf_s）， '\n'还在输入缓存里，因此fgets遇到他直接返回了。  你可能会问，为什么fgets不会呢，因为fgets可能会把'\n'放到输入缓存里，比如输入name时，用的fgets 若输入的字符串小于60，那么会将'\n'存到name里，在'\0'之前，即前一个字符就是'\n'，若输入的字符 串大于等于59时，'\n'就不存在name里。  可以去网上查一下fgets和scanf_s

user: user-2
content: 删掉puts函数里面的那一个空格，试一下

user: user-0
content: 有没有人帮忙看下，不知道什么情况

user: user-0
content: 我用vs2019按你的刚发改成getcher()报错，然后我根据你的思路把     fgets(studen2.name, 2, stdin);这段代码放到第二个学生信息前面发现也可以通过，而且我只给他分配了两个字节的内存这样也不会内存膨胀

user: user-0
content: 我用vs2019按你的刚发改成getcher()报错，然后我把     fgets(studen2.name, 2, stdin);这段代码放到第二个学生信息前面发现也可以通过，而且我只给他分配了两个字节的内存这样也不会内存膨胀