结构体数组的输入获取问题求助
你的代码问题分析与修复方案
兄弟,你的代码里有两个关键错误直接导致了控制台卡住的问题,我给你一一拆解:
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
相关产品推荐
相关产品推荐

