scanf循环读取数组输入异常,输出出现垃圾值求助
问题排查与修复
你的代码存在两个核心问题,直接导致了输入中断和垃圾值输出:
1. scanf未指定数组索引,写入地址错误
原代码中scanf("%c%f%d", &name, &price, &pages);的参数完全错误:
&name是整个字符数组的起始地址,而非当前循环i对应的元素地址- 同理
&price、&pages也是整个数组的地址,而非price[i]、pages[i]的地址
这会导致每次循环都往数组的起始位置写入数据,覆盖之前的内容,还会触发越界写操作,破坏内存,最终输出垃圾值。
2. %c格式符会读取输入缓冲区的换行符
当你输入第一组数据后按下回车,这个换行符会留在输入缓冲区里。下一次循环的%c会直接读取这个换行符,而不是等待你输入新的字符,这就导致输入流程被打断,无法完成第三组数据的输入。
修正后的完整代码
#include <stdio.h> int main() { int i; char name[3]; float price[3]; int pages[3]; printf("Enter names, prices and pages of 3 books:\n"); for (i = 0; i <=2; i++) { // 1. 加上空格跳过空白字符;2. 使用数组索引指定写入位置 scanf(" %c%f%d", &name[i], &price[i], &pages[i]); } printf("what you entered:\n"); for (i = 0; i <=2; i++) { printf("%c %f %d\n", name[i], price[i], pages[i]); } return 0; }
修正说明
- 在
%c前添加空格:" %c%f%d",让scanf自动跳过输入缓冲区中的空白字符(换行、空格等),确保每次%c都读取你输入的有效字符 - 将
&name改为&name[i],&price改为&price[i],&pages改为&pages[i],确保每组数据写入数组对应的索引位置
测试后就能得到你期望的输出效果。
内容的提问来源于stack exchange,提问作者Vatshal Negi
相关产品推荐
相关产品推荐

