C++姓名格式转换代码求助:输入语句错误导致无输出
修正姓名格式转换的C++代码问题
原代码的核心问题
cin >> str.length(name);是完全错误的语法,既不符合输入逻辑,也无法读取包含空格的完整姓名(cin >> str会在遇到空格时停止读取)。- 截取姓氏时,
str.substr(0, pos - 1)多减了1,pos是", "的起始索引,直接用str.substr(0, pos)就能拿到完整的lastName。 - 存在未使用的冗余变量
name和substr。 - 没有处理输入格式错误的情况(比如找不到
", "),会导致程序异常。
修正后的代码
#include <iostream> #include <string> using namespace std; int main() { string str; size_t pos; // 用size_t匹配string::find的返回类型,更规范 cout << "Enter a name in the following format: last name, first name middle name" << endl; getline(cin, str); // 读取整行输入,包含空格 pos = str.find(", "); if (pos == string::npos) { // 检查输入格式是否符合要求 cout << "Invalid input format! Please use 'lastName, firstName middleName'." << endl; return 1; } // 提取名和姓并重新拼接输出 cout << "The student's name is " << str.substr(pos + 2) << " " << str.substr(0, pos) << endl; return 0; }
关键修正说明
- 输入读取:用
getline(cin, str)替代错误的cin语句,确保能读取包含空格的完整姓名。 - 类型规范:将
int pos改为size_t pos,匹配string::find的返回类型,避免类型不匹配警告。 - 格式校验:增加了对
", "分隔符的检查,输入格式错误时给出提示并退出,提升程序健壮性。 - 字符串截取简化:
str.substr(pos + 2)直接从逗号空格的下一位取到结尾,无需手动计算长度;str.substr(0, pos)直接截取到逗号前的姓氏,逻辑更清晰。 - 冗余清理:移除了未使用的变量,精简代码结构。
内容的提问来源于stack exchange,提问作者calir
相关产品推荐
相关产品推荐

