如何消除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
相关产品推荐
相关产品推荐

