C++中string的size()在评测系统返回值偏大1的原因咨询
问题原因及解决办法
核心原因:评测系统的输入文件大概率是Windows格式的换行(\r\n)。本地如果是Windows环境,
getline会自动剔除换行时的\r;但编程竞赛评测系统一般用Linux/Unix环境,getline只识别\n作为行结束符并去掉,会把\r留在字符串末尾,导致size()/length()的返回值比实际多1。比如输入"test"后按回车,Windows下输入是"test\r\n",本地getline读成"test",但Linux环境下读成"test\r",size()自然就是5。验证方式:可以在代码里加一段输出字符ASCII码的逻辑,确认是否存在多余的
\r:for (char c : myvariable) { cout << static_cast<int>(c) << " "; }如果输出最后一个数值是13(
\r的ASCII码),就可以确定是这个问题。解决办法:
- 读取后手动移除末尾的
\r:if (!myvariable.empty() && myvariable.back() == '\r') { myvariable.pop_back(); } - 或者全局查找并删除所有
\r(适用于输入中可能存在多个\r的情况):size_t cr_pos; while ((cr_pos = myvariable.find('\r')) != string::npos) { myvariable.erase(cr_pos); }
- 读取后手动移除末尾的
内容的提问来源于stack exchange,提问作者Kentucker
相关产品推荐
相关产品推荐

