C++程序输出错误求助:姓名首字母缩写生成问题
姓名首字母缩写程序问题排查与修复
问题原因分析
- 输入读取不完整:使用
cin >> arr[i]读取姓名时,cin会以空格作为分隔符,导致每个姓名只存储了空格前的名,姓被丢弃,后续无法找到空格提取姓的首字母。 - 姓首字母提取错误:找到空格时,代码取的是空格字符本身而非空格后的第一个字符,还错误输出了换行符
endl,破坏了输出格式。 - 输出格式不符合要求:没有在每个缩写之间添加空格,导致输出连在一起,不符合题目要求的空格分隔格式。
修正后的代码
#include <iostream> #include <string> using namespace std; int main() { int numberofnames; cin >> numberofnames; cin.ignore(); // 忽略输入数量后的换行符,避免getline读取空行 string* arr = new string[numberofnames]; // 读取完整的姓名行 for (int i = 0; i < numberofnames; i++) { getline(cin, arr[i]); } // 生成并输出首字母缩写 for (int q = 0; q < numberofnames; q++) { // 输出名的首字母 cout << arr[q][0]; // 定位空格位置 size_t spacePos = arr[q].find(' '); if (spacePos != string::npos) { // 输出姓的首字母 cout << arr[q][spacePos + 1]; } // 非最后一个缩写则添加空格分隔 if (q != numberofnames - 1) { cout << " "; } } cout << endl; delete[] arr; // 释放动态分配的数组内存 return 0; }
代码修改说明
- 完整读取输入:用
cin.ignore()跳过输入姓名数量后的换行符,再通过getline读取整行姓名,确保名和姓都被完整存储。 - 高效提取首字母:直接取字符串首字符作为名的缩写,用
find(' ')快速定位空格位置,取空格后第一个字符作为姓的缩写,无需遍历整个字符串。 - 规范输出格式:在每个缩写后判断是否为最后一个,非最后一个则添加空格,最后统一输出换行,完全匹配题目要求的输出格式。
- 修复内存泄漏:添加
delete[] arr释放动态分配的数组内存,避免内存资源浪费。
内容的提问来源于stack exchange,提问作者frogProg
相关产品推荐
相关产品推荐

