字符串合法性判断逻辑错误排查:仅含R/G/B仍提示无效输入
判断字符串仅含R/G/B的C++代码逻辑错误排查
你的代码核心问题出在条件判断的逻辑运算符使用错误,导致无论输入什么字符,都会触发"invalid input1"的输出。
先看你原代码的关键错误部分:
#include <iostream> #include <string> using namespace std; int main(){ string s, t; cin >> s; for(int i=0; i<s.length(); i++){ // 这里的逻辑运算符完全错误 if(s[i]!='R' || s[i]!='G' || s[i]!='B'){ cout << "invalid input1"; break; } } }
错误原因分析
你想表达的逻辑是:当字符不是R、也不是G、还不是B时,判定输入非法,但你用了||(逻辑或),这会导致:
- 比如当前字符是'R',那么
s[i]!='G'和s[i]!='B'都是真,整个||条件结果为真,直接触发非法判断; - 同理,不管字符是G还是B,另外两个不等的条件永远成立,所以循环的第一次迭代就会输出错误信息并break。
正确的逻辑应该用&&(逻辑与),表示三个条件同时满足时才判定非法:
if(s[i] != 'R' && s[i] != 'G' && s[i] != 'B')
修正后的完整代码
另外补充一下,原代码没有处理输入完全合法的情况,这里可以加上提示:
#include <iostream> #include <string> using namespace std; int main(){ string s; cin >> s; bool valid = true; for(int i=0; i<s.length(); i++){ if(s[i] != 'R' && s[i] != 'G' && s[i] != 'B'){ cout << "invalid input1"; valid = false; break; } } if(valid){ cout << "valid input"; } return 0; }
额外优化方案
你也可以用C++字符串的find_first_not_of方法,一行代码完成判断,更简洁:
#include <iostream> #include <string> using namespace std; int main(){ string s; cin >> s; if(s.find_first_not_of("RGB") != string::npos){ cout << "invalid input1"; } else { cout << "valid input"; } return 0; }
内容的提问来源于stack exchange,提问作者Rifaqat Islam
相关产品推荐
相关产品推荐

