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

如何排查C++查找缺失扑克牌时find函数输出全部卡牌的问题

问题分析与解决

问题根源

你的代码之所以会输出所有卡牌,核心问题出在输入读取的方式上:
输入的牌格式是花色 点数(比如S 1),但你用cin >> existingCards[i]读取时,cin会把空格当成分隔符,每次只能读取到花色(比如S),剩下的点数(比如1)会被当成下一张牌存入existingCards。这就导致existingCards里的元素全是单个的字符串(要么是花色,要么是点数),和你生成的"S 1"这种完整格式的字符串完全不匹配,find自然找不到任何匹配项,最终会输出所有牌。

修正后的代码

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

using namespace std;

int main() {
    vector<string> suits = {"S", "H", "C", "D"};
    vector<string> ranks = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"};
    int n;
    cin >> n;
    // 跳过cin读取n后留下的换行符,避免第一个getline读空
    cin.ignore();
    
    vector<string> existingCards(n);
    for (int i = 0; i < n; ++i) {
        // 用getline读取包含空格的完整牌字符串
        getline(cin, existingCards[i]);
    }
    
    for (string suit : suits) {
        for (string rank : ranks) {
            string card = suit + " " + rank;
            if (find(existingCards.begin(), existingCards.end(), card) == existingCards.end()) {
                cout << card << endl;
            }
        }
    }
    return 0;
}

关键修改点

  1. 添加cin.ignore():在读取n之后,输入缓冲区里会留下一个换行符,直接用getline会先读到这个空行,所以必须先忽略它。
  2. 替换为getline读取:getline(cin, existingCards[i])可以读取包含空格的整行内容,这样每张牌的完整格式(花色+空格+点数)会被正确存入existingCards,后续的find就能正常匹配了。

可选优化(非必需)

如果想提高查找效率,可以把vector<string> existingCards换成unordered_set<string> existingCards,find操作的时间复杂度会从O(n)降到O(1),代码调整如下:

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

using namespace std;

int main() {
    vector<string> suits = {"S", "H", "C", "D"};
    vector<string> ranks = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"};
    int n;
    cin >> n;
    cin.ignore();
    
    unordered_set<string> existingCards;
    for (int i = 0; i < n; ++i) {
        string card;
        getline(cin, card);
        existingCards.insert(card);
    }
    
    for (string suit : suits) {
        for (string rank : ranks) {
            string card = suit + " " + rank;
            if (existingCards.find(card) == existingCards.end()) {
                cout << card << endl;
            }
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者dasd chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:00:12