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

C++字符串处理:如何在@符号处停止读取以提取姓氏

问题分析与修正

你的第二个循环存在两个关键错误:

  1. 终止条件逻辑完全错误:!ispunct(Email.length())里的Email.length()是字符串总长度,并非当前遍历的字符,这会让循环条件永远为真,导致一直读到字符串末尾。
  2. 缺失越界检查:如果邮箱格式不符合预期(比如没有@),直接访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:10:32