C++字符串数组搜索程序二次搜索返回全部内容问题排查求助
问题原因分析
- 输入缓冲区换行残留问题
首次搜索结束后,你使用cin >> again读取用户输入的Y/N选项,该操作只会读取输入流中的单个字符,用户按下回车键产生的\n换行符会残留在输入缓冲区中。
下一轮循环调用getline(cin, searchIn)时,getline遇到换行符就会终止读取,相当于获取到了一个空字符串作为搜索关键词。空字符串可以被任意字符串的find方法匹配到,所以程序会直接输出数组全部内容。 - 数组初始化语法错误
你定义的names数组共有12个元素,但初始化时"Bob Kain, 586-8712"、"Tim Haynes, 586-7676"两个元素末尾缺失逗号,C++会自动将相邻的无分隔字符串拼接,导致实际初始化的元素数量不足12个,剩余元素为空白字符串,同时存在数组越界访问的潜在风险。 - 非规范写法的潜在隐患
string::find方法匹配失败时的返回值是标准常量string::npos,虽然多数环境下该常量的值等于-1,但直接和-1对比存在类型不匹配的潜在问题。
修复方案
- 读取完
again变量后清理输入缓冲区残留的换行符,在cin >> again;后添加如下代码:
// 忽略缓冲区中直到换行符的所有剩余内容,需要引入<limits>头文件 cin.ignore(numeric_limits<streamsize>::max(), '\n');
如果不需要适配超长输入的场景,直接写cin.ignore();也可以解决当前问题。
2. 补全names数组初始化时两个缺失的逗号。
3. 将findPerson函数中的判断条件myArray[index].find(finder) != -1替换为myArray[index].find(finder) != string::npos,符合C++标准规范。
内容的提问来源于stack exchange,提问作者kirk
相关产品推荐
相关产品推荐

