如何判断一个单词的所有字符都存在于另一个单词中?附代码求助
问题分析与代码修正
首先看一下你的代码里存在的几个关键问题,这些都是导致它没达到预期效果的核心原因:
- 数组长度限制与溢出风险:你定义的
char N1[7]和char N2[10]是固定长度的数组,但用户输入的单词可能超过这个长度(比如示例里的stackoverflow有13个字符),这会导致缓冲区溢出,程序行为变得不可预测。更安全的做法是使用C++的std::string,它会自动管理内存,完全不用担心长度问题。 - 错误的循环条件:你写的
for (int i = 0; i <4; i++)和for (int j = 0; j <7; j++)是固定循环次数,不管输入单词的实际长度。比如如果第一个单词只有3个字符,循环到i=3时会访问数组里的垃圾值,直接导致错误判断。 - 赋值而非比较:
if (N1[i] = N2[j])这里用了赋值运算符=,而不是比较运算符==,这会把N2[j]的值赋给N1[i],然后判断这个值是否非零,完全不是你想要的字符相等判断逻辑。 - 逻辑错误:你的代码会在每次字符比较时都输出
YES或NO,而正确逻辑应该是检查第一个单词的所有字符是否都能在第二个单词中找到——只有全部找到才输出YES,只要有一个找不到就输出NO,应该在遍历完成后统一输出结果。
修正后的代码(使用std::string,简洁又安全)
#include <iostream> #include <string> using namespace std; int main() { string word1, word2; cout << "ENTER THE FIRST WORD : "; cin >> word1; cout << "ENTER THE SECOND WORD : "; cin >> word2; bool allCharsExist = true; // 遍历第一个单词的每个字符 for (char c : word1) { // 检查当前字符是否在第二个单词中,find返回npos表示未找到 if (word2.find(c) == string::npos) { allCharsExist = false; break; // 只要有一个字符找不到,直接退出循环,不用继续检查 } } // 根据最终结果输出 cout << (allCharsExist ? "YES" : "NO") << endl; return 0; }
如果你坚持使用C风格字符串的修正版本
如果你不想用std::string,也可以改进原有的C字符串代码,解决上述问题:
#include <iostream> #include <cstring> // 需要用strlen获取字符串实际长度 using namespace std; int main() { // 定义足够大的数组避免溢出,或者后续可以用动态内存分配优化 char word1[100]; char word2[100]; cout << "ENTER THE FIRST WORD : "; cin >> word1; cout << "ENTER THE SECOND WORD : "; cin >> word2; bool allCharsExist = true; int len1 = strlen(word1); int len2 = strlen(word2); for (int i = 0; i < len1; i++) { bool found = false; for (int j = 0; j < len2; j++) { if (word1[i] == word2[j]) { // 这里用==做字符比较 found = true; break; // 找到当前字符,退出内层循环 } } if (!found) { allCharsExist = false; break; } } cout << (allCharsExist ? "YES" : "NO") << endl; return 0; }
这两个版本都能正确实现你的需求:检查第一个单词的所有字符是否都存在于第二个单词中,最后统一输出YES或NO。
内容的提问来源于stack exchange,提问作者MrXQ
相关产品推荐
相关产品推荐

