CSV结构数据转终端表格显示异常及代码问题排查求助
问题排查:CSV转终端表格时行合并异常
问题描述
需将类CSV格式数据转换为终端表格,示例输入为"Player, PPG, RPG, APG, BLK \n Tim Duncan, 19.8, 10.8, 3.0, 2.2 \n Kareem Abdul-Jabbar, 24.6, 11.2, 3.6, 2.6",期望输出三行分隔的表格。但加入用户输入交互逻辑后,第二、第三行出现合并问题;固定输入时display_table函数运行正常。
相关代码
display_table函数
void display_table (const string& table_data, char delimeter, string new_line_char) { for (int k = 0; k < table_data.length(); k++) { if (table_data[k] == delimeter) { k++; cout << " | " << table_data[k]; } else if (k == table_data.find(new_line_char)) // Checks to see if index matches the ending { k++; cout << endl; } else { cout << table_data[k]; } } }
用户交互代码
string user_table_data; char delimeter; string new_line_char; cout << "Type in the data you want to print out: "; getline(cin, user_table_data, '\n'); cout << "What would you like the delimeter to be between columns of the table? Type here: "; cin >> delimeter; cin.ignore(); cout << "Which character would you like to indicate a new line? Type here: "; getline(cin, new_line_char, '\n'); cin.ignore(); display_table(user_table_data, delimeter, new_line_char); cin.ignore(); cin.get();
问题原因分析
- 转义字符未被正确解析:用户输入的
\n会被存储为两个普通字符(\和n),而非实际的换行符'\n'。函数中用table_data.find(new_line_char)查找时,只能匹配到第一个\n的起始位置(\的索引),处理后仅跳过一个字符,剩余的n会被当作普通内容输出,无法触发换行。 - find方法的逻辑缺陷:每次循环都会调用
table_data.find(new_line_char),该方法默认从字符串起始位置查找,找到第一个匹配后,后续循环中k会超过该位置,find返回string::npos,导致后续的换行标记完全无法被识别,只有第一行被正确拆分,后面的内容全部合并。 - 索引操作错误:处理换行标记时仅执行
k++,若new_line_char是多字符(如用户输入的\n),无法跳过整个标记字符串,导致部分字符残留并被输出。 - 冗余的输入处理:
getline(cin, new_line_char, '\n')之后调用cin.ignore()是多余的,getline已读取并丢弃换行符,该操作可能干扰后续输入,但不是行合并的直接原因。
修复建议
- 解析用户输入的转义字符:获取
user_table_data后,遍历字符串,将所有"\n"子串替换为实际的换行符'\n',确保换行标记被正确识别。 - 修正换行符匹配逻辑:若
new_line_char为单字符,直接判断table_data[k]是否等于该字符;若为多字符,检查当前位置开始的子串是否与new_line_char匹配,匹配则输出换行并跳过整个标记的长度(k += new_line_char.length()),而非仅k++。 - 优化find方法的使用:在循环外预先查找所有换行标记的位置,或在循环中从当前
k的位置开始查找(table_data.find(new_line_char, k)),避免重复查找已处理过的区域。 - 移除冗余的cin.ignore():删除
getline(cin, new_line_char, '\n')之后的cin.ignore()调用,避免干扰输入流。
内容的提问来源于stack exchange,提问作者Jonathan Isozaki
相关产品推荐
相关产品推荐

