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

结构体数组的输入获取问题求助

你的代码问题分析与修复方案

兄弟,你的代码里有两个关键错误直接导致了控制台卡住的问题,我给你一一拆解:

1. 输入顺序完全搞反了

你在控制台提示用户输入姓名,但代码里却先执行了cin >> scores[counter].score——这会把用户输入的姓名当成整数分数读入,不仅数据存错,还会导致后续的输入逻辑彻底混乱。

2. 错误的do-while循环导致无限执行

这个循环的判断条件scores[counter].name != '\0'完全不成立:

  • scores[counter].name是C风格字符串数组的首地址(指针类型),而'\0'是一个字符值(ASCII码0)
  • 指针和字符值比较永远不会相等,所以这个循环会无限运行,这就是控制台光标一直闪烁、无法接受新输入的根本原因
  • 另外,cin >> scores[counter].name本身就会自动在字符串末尾添加'\0',完全不需要额外循环处理

修正后的基础版代码

#include <iostream>
using namespace std;

// 先定义charSize常量,原代码里缺失这部分
const int charSize = 50;

struct highscore {
    int score;
    char name[charSize];
};

void initializeData(highscore scores[], int size) {
    for (int counter = 0; counter < size; counter++) {
        cout << "Enter the name for score #" << (counter + 1) << ": ";
        // 先读取姓名,和提示文本对应
        cin >> scores[counter].name;
        cout << "Enter the score for score #" << (counter + 1) << ": ";
        // 再读取分数
        cin >> scores[counter].score;
    }
}

额外补充:支持带空格的姓名

如果你的姓名需要包含空格(比如"John Doe"),cin >>会在空格处截断字符串,这时候可以用cin.getline()来读取整行,但要注意处理之前输入分数后留下的换行符:

void initializeData(highscore scores[], int size) {
    for (int counter = 0; counter < size; counter++) {
        cout << "Enter the name for score #" << (counter + 1) << ": ";
        // 忽略之前输入操作留下的换行符,避免getline直接读取空行
        cin.ignore();
        // 读取整行内容,最多charSize-1个字符(留位置存'\0')
        cin.getline(scores[counter].name, charSize);
        cout << "Enter the score for score #" << (counter + 1) << ": ";
        cin >> scores[counter].score;
    }
}

内容的提问来源于stack exchange,提问作者ashton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:23:43