如何排查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; }
关键修改点
- 添加
cin.ignore():在读取n之后,输入缓冲区里会留下一个换行符,直接用getline会先读到这个空行,所以必须先忽略它。 - 替换为
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
相关产品推荐
相关产品推荐

