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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:22:41