C++ 导致循环未完全运行的If语句?C++;

C++ 导致循环未完全运行的If语句?C++;,c++,C++,我试图检查输入的字符串是否包含除这些字符以外的任何字符。如果是,我希望它返回false。然而,当我输入像“ABCEDF”这样的字符串时,它返回true。看起来它只是在检查第一个字符/索引。如何使用for循环和if语句检查输入的字符串是否符合正确的条件并相应地返回true/false 如果条件为true则返回true。如果条件为false,则返回false。在不返回的条件下没有分支 您的代码相当于 for (int k = 0; k != s.size(); k++) { if (s[k]

我试图检查输入的字符串是否包含除这些字符以外的任何字符。如果是,我希望它返回false。然而,当我输入像“ABCEDF”这样的字符串时,它返回true。看起来它只是在检查第一个字符/索引。如何使用for循环和if语句检查输入的字符串是否符合正确的条件并相应地返回true/false

如果条件为
true
则返回
true
。如果条件为
false
,则返回
false
。在不返回
的条件下没有分支

您的代码相当于

for (int k = 0; k != s.size(); k++)
{
    if (s[k] == 'A' || s[k] == 'B' || s[k] == 'C' || s[k] == 'D' )
        return true; 
    else 
        return false;
}
换句话说,你无条件返回


在不知道你想做什么或正在做什么的情况下,我猜你可能会想要这样的东西:

for (int k = 0; k != s.size(); k++)
{
    return (s[k] == 'A' || s[k] == 'B' || s[k] == 'C' || s[k] == 'D' );
}

只有在循环之后才返回false。

问题在于,您实际上是在检查第一个字符是否是
if
中列出的字符之一。 该错误是算法错误,因为为了确定字符串是否包含除
ABCD
以外的字符,您必须至少读取输入字符串的每个字符。 这意味着: 如果读取的内容与
ABCD
不同,则在循环内返回true。 如果您已经阅读了整个字符串,但仍然没有返回,那么,猜猜看,字符串仅由
ABCD
s组成,因此您可以返回false

另外,如果要检查字符串是否包含除
ABCD
以外的任何字符,则应检查
s[k]=A&s[k]=B&s[k]=C&s[k]=D

应采取以下措施:

for (int k = 0; k != s.size(); k++)
{
    if (s[k] == 'A' || s[k] == 'B' || s[k] == 'C' || s[k] == 'D' )
        return true;
}

return false;

你真的不需要循环和一堆if语句来完成这个任务,你可以编写一个简单的函数来完成这个任务。检查这段代码

bool otherThanABCD(const string& s){
    for (int k = 0; k != s.size(); k++){
        if (!(s[k] == 'A' || s[k] == 'B' || s[k] == 'C' || s[k] == 'D') )    
    // there is a char which is not ABC or D!
          return true; 
   }
    // I have read the whole string, but still nothing other than ABC and D
 return false;
}
#包括
#包括
//这个checkString函数就是您真正需要的!
bool checkString(const std::string&stringToCheck,const std::string&checkAgainstThis){
if(stringToCheck.empty()| |检查this.empty()){
//抛出异常-两个字符串中都没有任何内容!
}
std::basic_string::size_type firstIndex=stringToCheck.find_first_not_of(针对此项进行检查);
if(firstIndex==std::string::npos){
return true;//未找到任何内容。
}
return false;//找到的内容不是。
}
//用于在主功能中显示消息的帮助器功能-这些功能对于
//上述功能;只是使主要功能更清晰,更易于阅读
无效显示检查消息(常量std::string&a、常量std::string&b){

std::cout if/else在循环中发生。它在第一次迭代中将始终返回true或false。在循环完成后,您可能希望返回false。@thiskidduh如果您想在
s
中找到子字符串,请使用该函数。
#include <string>
#include <iostream>

// This checkString function is all you really need!
bool checkString( const std::string& stringToCheck, const std::string& checkAgainstThis ) {
    if ( stringToCheck.empty() || checkAgainstThis.empty() ) {
        // throw exception - both strings have nothing in them!
    }

    std::basic_string<char>::size_type firstIndex = stringToCheck.find_first_not_of( checkAgainstThis );
    if ( firstIndex == std::string::npos ) {
        return true;  // Didn't find anything.
    }

    return false;  // Found something other than.
}

// helper functions to display messages in main function - these are not required for
// the above function; just makes the main function cleaner and easier to read

void displayCheckingMessage( const std::string& a, const std::string& b ) {
    std::cout << "Checking string " << a << "\nto see if it contains any character other than this set: " << b << ".\n";
}

void displayResultMessage( bool condition, const std::string& str ) {
    if ( condition ) {
        std::cout << "Did not find any other characters.\n\n";
    } else {
        std::cout << "Found something other than " << str << ".\n\n";
    }
}

int main() {    
    std::string stringToCheck( "ABCADCDABC" );
    const std::string checkAgainstThis( "ABCD" );

    displayCheckingMessage( stringToCheck, checkAgainstThis );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis ), checkAgainstThis );

    stringToCheck.clear();
    stringToCheck = std::string( "ABCDE" );
    displayCheckingMessage( stringToCheck, checkAgainstThis );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis ), checkAgainstThis );

    stringToCheck.clear();
    stringToCheck = std::string( "AAABBBCCCDDDAAABBDDCCSSRRAASSGGSS" );
    displayCheckingMessage( stringToCheck, checkAgainstThis );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis ), checkAgainstThis );

    stringToCheck.clear();
    stringToCheck = std::string( "AAAAAAAAAAAAAAAAABBBBBBBBBBBBBAAAAAAAAAAAAAAACCCCCCCCCCCCDDDDDDDDDDD" );
    displayCheckingMessage( stringToCheck, checkAgainstThis );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis ), checkAgainstThis );

    stringToCheck.append( "XABCD" );
    displayCheckingMessage( stringToCheck, checkAgainstThis );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis ), checkAgainstThis );

    // try a different set
    std::cout << "\n";
    const std::string checkAgainstThis2( "XYZ" );
    displayCheckingMessage( stringToCheck, checkAgainstThis2 );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis2 ), checkAgainstThis2 );

    stringToCheck.clear();
    stringToCheck = std::string( "XYZXYZXYZXYZ" );
    displayCheckingMessage( stringToCheck, checkAgainstThis2 );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis2 ), checkAgainstThis2 );

    stringToCheck.append( "8?#XYZXYSAZC" );
    std::cout << "\n" << stringToCheck << "\n";
    displayCheckingMessage( stringToCheck, checkAgainstThis2 );
    displayResultMessage( checkString( stringToCheck, checkAgainstThis2 ), checkAgainstThis2 );

    return 0;
}