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

如何消除C++歌曲播放列表代码输出中的多余空格?

问题:读取歌曲信息生成播放列表时输出存在多余空格

需求:实现读取歌曲时长与名称并生成播放列表的功能,输入每行先为歌曲时长,后为歌曲名,输入-1结束。输入示例:

424 Time
383 Money
-1

编写的C++代码如下:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Song {
public:
    void SetDurationAndName(int songDuration, string songName) {
        duration = songDuration;
        name = songName;
    }

    void PrintSong() const {
        cout << duration << " - " << name << endl;
    }

    int GetDuration() const { return duration; }

    string GetName() const { return name; }

private:
    int duration;
    string name;
};

int main() {
    vector<Song> playlist;
    Song newSong;
    int songDuration;
    string songName;
    unsigned int i;

    cin >> songDuration;
    while (songDuration >= 0) {
     /* Solution is below */

        getline(cin, songName);
        newSong.SetDurationAndName(songDuration, songName);
        playlist.push_back(newSong);
           /* Solution is above */

         cin >> songDuration;
    }

    for (i = 0; i < playlist.size(); ++i) {
        newSong = playlist.at(i);
        newSong.PrintSong();
    }
    return 0;
}

运行代码后输出存在多余空格,需要解决这个问题。


问题原因

问题出在输入读取逻辑上:当用cin >> songDuration读取时长后,输入缓冲区中会留下时长后的空格+换行符。接下来调用getline(cin, songName)时,会把这个空格也读进songName里,导致最终输出时歌名前多了一个空格。

解决方案

有两种简单的修复方式:

方法1:忽略输入缓冲区的剩余空白

在cin >> songDuration之后,调用cin.ignore()跳过缓冲区中剩余的换行符及空白,确保getline读取到完整的歌名:

#include <limits>  // 需要添加这个头文件

// ... 其他代码不变 ...

cin >> songDuration;
while (songDuration >= 0) {
    // 跳过缓冲区中直到换行符的所有内容
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    getline(cin, songName);
    newSong.SetDurationAndName(songDuration, songName);
    playlist.push_back(newSong);

    cin >> songDuration;
}

方法2:直接用cin读取歌名(适用于歌名无空格的场景)

如果你的歌名都是单字(无空格),可以直接用cin >> songName读取,它会自动跳过前面的空白,无需处理换行符:

cin >> songDuration;
while (songDuration >= 0) {
    cin >> songName;
    newSong.SetDurationAndName(songDuration, songName);
    playlist.push_back(newSong);

    cin >> songDuration;
}

这种方式更简洁,完全适配你的输入场景。

修复后输出示例

输入示例数据后,输出会变为:

424 - Time
383 - Money

多余的空格已被消除。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:20:36