C语言程序为何不提示输入box名称?有哪些替代方案?
问题原因与解决方案
问题根源
输入完box的id并按下回车后,换行符\n会残留在输入缓冲区中。当执行scanf("%[^\n]", boxes[i].name);时,这个格式说明符要求读取所有非换行的字符,但缓冲区首位就是换行符,导致scanf直接读取到空内容,程序跳过了名称输入步骤。
而你之前用scanf("%s")只能读单个单词,是因为%s遇到任何空白字符(空格、换行、制表符)就会停止读取,无法处理带空格的名称。
可行解决方案
方案1:清空输入缓冲区
在读取id后,手动清空缓冲区中残留的换行符,确保后续的scanf能正确读取名称:
void fill_boxes(box *boxes, int length) { for (int i = 0; i < length; i++) { printf("Enter box %d id: ", i+1); scanf("%d",&boxes[i].id); // 清空缓冲区直到遇到换行符,处理多余的空白字符 while ((getchar()) != '\n'); printf("Enter box %d name: ", i+1); scanf("%[^\n]",boxes[i].name); // 读完名称后同样清空缓冲区,避免影响下一次循环 while ((getchar()) != '\n'); } }
也可以给scanf指定输入长度限制,避免缓冲区溢出:scanf("%49[^\n]", boxes[i].name);(name数组大小为50,留一个位置给结束符)。
方案2:使用fgets读取整行(更推荐)
fgets可以读取包含空格的整行输入,同时配合sscanf处理id的转换,彻底避免缓冲区残留问题:
void fill_boxes(box *boxes, int length) { char buffer[100]; for (int i = 0; i < length; i++) { printf("Enter box %d id: ", i+1); // 读取整行id输入(包含换行) fgets(buffer, sizeof(buffer), stdin); // 从缓冲区中提取整数id sscanf(buffer, "%d", &boxes[i].id); printf("Enter box %d name: ", i+1); // 读取名称,自动处理空格 fgets(boxes[i].name, sizeof(boxes[i].name), stdin); // 去掉fgets读取到的末尾换行符 boxes[i].name[strcspn(boxes[i].name, "\n")] = '\0'; } }
注:
strcspn函数会返回字符串中第一个换行符的位置,将该位置替换为\0即可去除多余的换行。
内容的提问来源于stack exchange,提问作者Kiriyama Rei
相关产品推荐
相关产品推荐

