C++ C++;检查字符串是否至少包含1个数字和1个字母
我试图在返回true之前检查字符串输入是否至少包含一个数字和一个字母 我的方法是首先循环使用这个词。 如果单词不包含C++ C++;检查字符串是否至少包含1个数字和1个字母,c++,C++,我试图在返回true之前检查字符串输入是否至少包含一个数字和一个字母 我的方法是首先循环使用这个词。 如果单词不包含isalpha或isdigit,则返回false 检查之后,我创建了两个计数(一个用于数字,一个用于字母)。我检查isalpha,然后在计数中添加一个。然后我检查isdigit,并将其添加到该计数中 最后,我检查两个计数是否大于或等于1(意味着它至少包含一个数字和一个字母),并返回true。我知道计数不是最好的方法,但我只是想测试一下这个方法,但它失败了,我不确定我的逻辑哪里是错的
isalpha
或isdigit
,则返回false
检查之后,我创建了两个计数(一个用于数字,一个用于字母)。我检查isalpha
,然后在计数中添加一个。然后我检查isdigit
,并将其添加到该计数中
最后,我检查两个计数是否大于或等于1(意味着它至少包含一个数字和一个字母),并返回true。我知道计数不是最好的方法,但我只是想测试一下这个方法,但它失败了,我不确定我的逻辑哪里是错的
bool isDigitLetter::filter(string word) {
int digit = 0;
int letter = 0;
if(word.empty()) {
return false;
}
for(int i = 0; i < word.length(); i++) {
if(!isalpha((unsigned char)word[i]) || !isdigit((unsigned char)word[i])) {
return false;
}
}
for(int x = 0; x < word.length(); x++) {
if(isalpha((unsigned char)word[x])) {
letter+=1;
}
if(isdigit((unsigned char)word[x])) {
digit+=1;
}
}
if(digit && letter>= 1) {
return true;
}
}
bool-isDigitLetter::filter(字符串字){
整数位数=0;
int字母=0;
if(word.empty()){
返回false;
}
for(int i=0;i=1){
返回true;
}
}
我在想也许可以使用
isalnum
,但如果它包含其中一个,则返回true,但不检查它是否至少包含其中一个。bool isDigitLetter::filter(字符串字){
bool isDigitLetter::filter(string word) {
bool hasLetter = false;
bool hasDigit = false;
for (int i = 0; i < word.size(); i++) {
if (isdigit(word.at(i))) { hasDigit = true; }
if (isalpha(word.at(i))) { hasLetter = true; }
}
return (hasLetter && hasDigit);
}
bool hasLetter=false;
bool hasDigit=false;
for(int i=0;i
此解决方案删除了大量不必要的代码
基本上,它在字符串中循环并检查每个字符是字母还是数字。每次看到一个,它都会更新hasLetter/hasDigit变量。然后,如果两者都为true,则返回true,否则返回false
编辑:这个解决方案更快-如果它已经看到一个字母和一个数字,它会立即返回
bool isDigitLetter::filter(string word) {
bool hasLetter = false;
bool hasDigit = false;
for (int i = 0; i < word.size(); i++) {
if (isdigit(word.at(i))) { hasDigit = true; }
if (isalpha(word.at(i))) { hasLetter = true; }
if (hasDigit && hasLetter) { return true; }
}
// we got here and couldn't find a letter and a digit
return false;
}
bool-isDigitLetter::filter(字符串字){
bool hasLetter=false;
bool hasDigit=false;
for(int i=0;i
应该是这样的:
bool isDigitLetter::filter(string word) {
int digit = 0;
int letter = 0;
if(word.empty()) {
return false;
}
// for(int i = 0; i < word.length(); i++) {
// if(!isalpha((unsigned char)word[i]) || !isdigit((unsigned char)word[i])) {
// return false;
// }
// }
for(int x = 0; x < word.length(); x++) {
if(isalpha((unsigned char)word[x])) {
letter+=1;
}
if(isdigit((unsigned char)word[x])) {
digit+=1;
}
}
return ((digit > 0) && (letter > 0));
}
bool-isDigitLetter::filter(字符串字){
整数位数=0;
int字母=0;
if(word.empty()){
返回false;
}
//for(int i=0;i0)和&(字母>0));
}
您的问题在于这一行:
if(digit && letter>= 1)
将其更改为:
if(digit >=1 && letter>= 1)
使用调试器并逐步完成程序。查看与预期不同的地方,并更详细地检查该行。使用调试器。
if(digit&&letter>=1)
这将始终是正确的bool-isDigitLetter::filter(std::string-word){return std::any_of(word.begin(),word.end(),[](char c){return std::isalpha(c)}和&std::any of(word.begin(),word.end(),[](char c){return std::isdigit(c);};}
“至少1”不需要完整的计数。一个循环就足够了;它只需要跟踪是否看到一个数字和一个字母,一旦看到这两个数字,就完成了。嗯……不完全如此。if(digit)
相当于if(digit!=0)
;是的,这与检查=1
不一样,因为数字的负值也是如此,但因为数字
从0开始,只上升,它们做同样的事情。你的编辑并不能使它成为一个更好的答案。这一行不是问题。@SandraK我知道这是一个逻辑错误,但无意中没有影响代码执行。无论如何都必须纠正。如果字母
和数字
都大于0,循环也可以提前终止。另外,请注意,返回
语句中的括号是多余的。返回数字>0&&letter>0;
做的事情完全相同。只是开玩笑,没有冒犯:)@p-a-o-l-o——多余的括号使代码更难阅读;你必须弄清楚它们是否真的有意义。初学者喜欢它们,但程序员不是初学者,需要学习编写代码而不增加干扰。是的,任何系统从0.1微秒的提升中都会获得惊人的收益。:)谢谢你,我相信你的if语句你少了一个括号?你总共打开了3个,但关闭了2个。嗯,让我看看你的报税表上还有一个分号(编辑前)哦,好的,找到了-修复了…编辑了-好吗?@godlyplusplust就是这样。还有报税表后的分号(hasLetter&&hasDigit)