C++字符串处理:如何在@符号处停止读取以提取姓氏
问题分析与修正
你的第二个循环存在两个关键错误:
- 终止条件逻辑完全错误:
!ispunct(Email.length())里的Email.length()是字符串总长度,并非当前遍历的字符,这会让循环条件永远为真,导致一直读到字符串末尾。 - 缺失越界检查:如果邮箱格式不符合预期(比如没有
@),直接访问Email[i]会触发越界错误。
修正后的代码
FirstName = ""; LastName = ""; string::size_type i; // 提取第一个标点前的FirstName for (i = 0; i < Email.length() && !ispunct(Email.at(i)); i++) FirstName += Email.at(i); // 用+=比+更高效,避免频繁创建临时字符串 // 跳过第一个标点(即.),提取LastName直到遇到@ if (i < Email.length()) { // 确保当前位置有效 i++; // 跳过分隔firstname的. for (; i < Email.length() && !ispunct(Email.at(i)); i++) LastName += Email.at(i); }
关键说明
- 第二个循环的终止条件改为
i < Email.length() && !ispunct(Email.at(i)):既保证不会越界,又能在遇到下一个标点(也就是@)时停止,刚好提取出.和@之间的姓氏部分。 - 用
+=代替+拼接字符串:每次FirstName = FirstName + Email.at(i)都会创建新的临时字符串,效率远低于直接追加的+=。 - 增加越界检查:避免因邮箱格式异常导致程序崩溃。
内容的提问来源于stack exchange,提问作者TBG
相关产品推荐
相关产品推荐

