C++ 代码用于抽取字符串中的电话号码。约定:电话号码全部是数字,数字之间没有其他符号如连字符或空格等。代码中变量 strSrc 仅仅是示例,可以包含更多字符。下面有关代码说法,正确的说法是()。
string strSrc="红十字:01084025890火警电话:119急救电话:120紧急求助:110";
string tel="";
for(int i=0;i<=strSrc.length();i++)
{
if(strSrc[i]>='0'&&strSrc[i]<='9')
{
tel=tel+strSrc[i];
}
else if(tel!="")
{
cout<<tel<<endl;
tel="";
}
}这道题考字符串遍历、循环边界和分支结构。拿到题先看循环条件:i<=strSrc.length() 是经典越界陷阱,但本题里越界访问到的字符恰好是空,不影响逻辑。核心在于 else 与最近未匹配的 if 结合,以及 cout<<tel<<endl 带来的换行效果。
最容易错选 B 或 C。B 错在以为 cout 不换行,其实 endl 就是换行符;C 错在脑补了分隔符,代码里根本没写任何插入逻辑。D 也常见,有人觉得循环条件写错就全错了,其实越界读到一个空字符对结果无影响。另外,很多人会纠结 if 嵌套层次,其实 else 总是和最近的未匹配 if 配对,不用管花括号。
GESP 三级 C++ 模块“字符串处理与循环控制”。命题人卡住的是学生把 i<=strSrc.length() 误当正确边界——多数人在写 for 时习惯性加等号,却忘了数组下标从 0 开始,多跑一次必然越界。这道题就是专门挖这个坑:虽然越界访问到的字符是空,逻辑上不影响输出,但属于典型错误。