C++实现随机句子生成的string函数拼接触发std::length_error报错排查
报错含义说明
std::length_error是C++标准库字符串类抛出的长度非法异常,你遇到的basic_string::_S_create报错,本质是程序试图使用无效内存创建/拼接字符串对象,触发的未定义行为。
报错产生原因
- 你定义返回值类型为
string的subject()、sentence()两个函数,内部完全没有return语句,执行完函数逻辑后会返回随机的无效内存地址,后续拼接字符串时访问这块非法内存,直接触发长度错误异常。 - 你在每个取值函数里都调用一次
srand(time(NULL)),time()的精度为秒级,短时间内多次调用会得到完全相同的随机种子,导致随机数固定,无法实现随机选取片段的效果。 - 编写的
isTerminal()函数未被任何逻辑调用,属于冗余代码,不影响报错但可以删除简化程序。
修正方案
- 给
subject()函数补上返回值逻辑,移除内部的打印语句,把随机选中的主语字符串返回 - 给
sentence()函数调整返回值类型为void,因为它仅负责打印拼接好的句子,不需要返回值,避免无返回值的未定义行为 - 将随机种子播种逻辑
srand(time(NULL))移到main()函数开头,仅执行一次,保证随机数生效 - 删除未使用的
isTerminal()函数
修正后可运行代码
#include<iostream> #include<string> #include<cstdlib> #include<ctime> using namespace std; string subject() { string subjects[3] = {"This ", "Computers ", "I "}; int i = rand() % 3; return subjects[i]; } string verb() { string verbs[4] = {"is ","run ","am ","tell "}; int i = rand() % 4; return verbs[i]; } string noun(){ string nouns[4] = {"university ","world ","cheese ","lie "}; int i = rand() % 4; return nouns[i]; } void sentence(){ string combine_sentence = subject() + verb() + noun(); cout << combine_sentence << endl; } int main() { srand(time(NULL)); // 仅初始化一次随机种子,避免重复播种失效 sentence(); return 0; }
内容的提问来源于stack exchange,提问作者Duck1010
相关产品推荐
相关产品推荐

