You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:07:35