无法打印结构体变量的char类型成员问题求助
嘿,我瞅了你的代码,问题基本出在输入缓冲区残留的换行符以及循环逻辑的小错误上,导致结构体里的char成员没被正确读取,自然打印不出来。咱们一步步来搞定:
问题分析与修复方案
1. 开头的换行处理逻辑写反了
你最开始写的这个while循环:
while ((ch = getchar()) == '\n' && ch != EOF) { }
逻辑完全搞反了——它只会在读取到'\n'的时候才执行循环,但你实际是想跳过缓冲区里残留的换行符。正确的写法应该是吃掉缓冲区里的残留字符,直到遇到换行或EOF:
// 清空输入缓冲区里的残留字符,直到遇到换行或EOF while ((ch = getchar()) != '\n' && ch != EOF) {}
2. scanf_s读取char后的缓冲区残留坑
当你用scanf_s("%c", &b1.name, sizeof(char))输入一个字符(比如敲个A再按回车),此时输入缓冲区里会剩下一个'\n'。后续读取float、int类型的时候,scanf_s会自动跳过空白字符,所以没问题,但如果下一次还是读取char,就会直接把这个换行符读进去,导致你的b2.name变成换行符,打印的时候当然看不到东西。
修复后的完整代码
我给你调整了代码,修正了循环逻辑,并且在每次读取char前都正确清空缓冲区:
#include<stdio.h> int main() { struct book { char name; float price; int pages; }; struct book b1, b2, b3; char ch; printf("\nEnter the info of the books:\n"); // 读取第一本书的信息 // 先清空缓冲区可能的残留 while ((ch = getchar()) != '\n' && ch != EOF) {} scanf_s("%c", &b1.name, sizeof(char)); scanf_s("%f", &b1.price, sizeof(float)); scanf_s("%d", &b1.pages, sizeof(int)); // 读取第二本书前,清空输入pages后留下的换行符 while ((ch = getchar()) != '\n' && ch != EOF) {} scanf_s("%c", &b2.name, sizeof(char)); scanf_s("%f", &b2.price, sizeof(float)); scanf_s("%d", &b2.pages, sizeof(int)); // 第三本书同理处理... // 打印测试,验证结果 printf("\nBook 1 Details:\n"); printf("Name: %c\nPrice: %.2f\nPages: %d\n", b1.name, b1.price, b1.pages); printf("\nBook 2 Details:\n"); printf("Name: %c\nPrice: %.2f\nPages: %d\n", b2.name, b2.price, b2.pages); return 0; }
更省心的小技巧
要是觉得每次写while循环清空缓冲区太麻烦,你可以在读取char的scanf_s格式串前面加个空格——这个空格会让scanf_s自动跳过所有空白字符(包括换行、空格、制表符),省得手动处理:
// 注意%c前面的空格 scanf_s(" %c", &b1.name, sizeof(char));
这样就不用写那些while循环了,是不是简洁多了?
内容的提问来源于stack exchange,提问作者Varun Rustgi
相关产品推荐
相关产品推荐

