C++查找字符串数组最长名字的代码运行异常问题求助
代码运行异常问题排查
直接触发报错/无输出的核心问题
- 未初始化局部变量
j,直接引发非法内存访问
你定义了int j用来存储最长名字的下标,但没有赋初始值。局部变量在未初始化时,存储的是栈上残留的随机垃圾值。循环逻辑里只有当遇到比当前记录长度更长的名字时,才会给j赋值:如果数组第一个名字就是全局最长的,循环内的判断分支永远不会触发,j会一直是随机值。此时访问names[j]会直接越界,操作系统检测到非法内存读写就会触发段错误。就算在Code::Blocks里运行没有崩溃,随机值j指向的内存也不是合法的名字数组元素,根本打印不出预期内容。 - 函数返回值逻辑与声明完全不匹配
你声明longest函数的返回类型是string,但函数内部没有任何return语句,仅通过cout直接打印内容。C++标准规定,声明了非void返回值的函数如果没有返回值,属于未定义行为——编译器会随便返回一个无意义的垃圾字符串。在main函数中你又写了cout << ob.longest(names, n)打印返回值,就会出现输出混乱、甚至完全没有有效内容的问题。 - 混入冗余调试输出,触发刷题平台校验错误
你在函数内加的cout << "length of first string is:" << len1 << endl;这类调试打印,会让程序实际输出和平台要求的格式完全不一致,轻则被判输出格式错误,重则因为输出流异常触发运行失败。 - 使用非标准C++语法,带来跨平台兼容问题
代码中string names[n]的写法属于C99的变长数组扩展,不属于标准C规范。仅GCC等少数编译器支持该语法,在严格遵循C标准的编译环境下,这类写法本身就会引发运行错误。 - 遍历逻辑存在无意义冗余
从i=0开始遍历对比时,会把第一个名字和自己的初始长度做无意义的比较,虽然不会直接引发错误,但逻辑上冗余低效。
修正后的可直接运行代码
#include <iostream> #include <string> #include <vector> using namespace std; class Solution{ public: string longest(string names[], int n){ // 初始化最长下标为0,从根源上避免未初始化的随机值问题 int longest_idx = 0; // 从下标1开始遍历,跳过和第一个元素的无意义对比 for(int i = 1 ; i < n ; i++) { if(names[i].length() > names[longest_idx].length()){ longest_idx = i; } } // 严格按函数声明返回对应结果,不在函数内部随意操作输出流 return names[longest_idx]; } }; int main() { int t; cin >> t; while(t--){ int n; cin >> n; // 用标准vector替代非标准变长数组,兼容所有C++编译环境 vector<string> names(n); for(int i = 0; i < n; i++) cin >> names[i]; Solution ob; cout << ob.longest(names.data(), n) << endl; } return 0; }
修正逻辑对应
- 初始化最长名字下标为0,彻底消除局部变量未初始化带来的越界风险
- 移除函数内所有调试打印,让函数只负责计算返回结果,不直接操控输出流,适配刷题平台的输出校验规则
- 用标准库
vector替代非标准的变长数组,消除跨平台编译运行的兼容问题 - 调整遍历起点为
i=1,减少无意义的自对比,逻辑更清晰高效 - 严格匹配函数的返回值声明,避免未定义行为带来的输出混乱
内容的提问来源于stack exchange,提问作者Nikhil Panchal
相关产品推荐
相关产品推荐

