You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++入门习题求助:重复姓名输入报错实现及判断逻辑失效问题

C++入门第四章习题19:姓名重复判断问题解答

嘿,我明白你现在卡在姓名重复判断的问题上了,咱们就用你目前学到的第四章知识来解决这个问题,绝对不超纲~

首先,你说if(name == names[i])判断不生效,大概率是检查重复的时机不对——比如你可能是先把姓名加到vector里再去检查,或者循环的范围没覆盖所有已有的姓名。咱们先明确需求:每次输入一对姓名和分数时,先检查这个姓名是不是已经在names里了,如果是就输出错误提示,不添加;如果不是,再把姓名和分数分别存入对应的vector。

下面是符合你当前水平的代码,我加了详细注释:

#include <iostream>
#include <vector>
#include <string>

using namespace std; // 第四章应该已经学了这个用法,没问题

int main() {
    vector<string> names;
    vector<int> scores;
    string name;
    int score;

    cout << "请输入姓名和分数(如:Joe 17),输入NoNo 0结束:\n";
    while (cin >> name >> score) {
        // 先判断是否是结束指令
        if (name == "NoNo" && score == 0) {
            break;
        }

        // 核心:检查当前输入的姓名是否已经存在
        bool is_duplicate = false;
        for (int i = 0; i < names.size(); ++i) {
            if (name == names[i]) { // 这里的判断逻辑本身是有效的,string支持直接用==比较内容
                is_duplicate = true;
                break; // 找到重复就跳出循环,不用继续检查了
            }
        }

        if (is_duplicate) {
            cout << "错误:姓名" << name << "已经存在!\n";
        } else {
            // 没有重复,才添加到两个vector中
            names.push_back(name);
            scores.push_back(score);
            cout << "已添加:" << name << " " << score << "\n";
        }
    }

    // 可选:输出所有存储的内容,验证结果
    cout << "\n所有存储的姓名和分数:\n";
    for (int i = 0; i < names.size(); ++i) {
        cout << names[i] << " " << scores[i] << "\n";
    }

    return 0;
}

关键知识点说明(都是第四章的内容):

  • string的相等判断:C++的string类型可以直接用==来比较两个字符串的内容是否完全一致,你之前的判断逻辑本身是对的,只是时机不对。
  • 检查时机:必须在把姓名添加到names之前检查,不然重复的姓名已经被存进去了,再查就晚了。
  • 循环范围:for (int i = 0; i < names.size(); ++i)——这里names.size()是当前已经存储的姓名数量,刚好覆盖所有已有的元素,不会出现越界问题。

你可以把这段代码替换你原来的代码试试,输入重复姓名的时候就会输出错误提示啦~

内容的提问来源于stack exchange,提问作者Vladar Akos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:28:59