2017-10-22 11 views
0
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; 
} 

入力した文字列にこれら以外の文字が含まれていないかどうかを確認しようとしています。もしそうなら、私はそれを偽に戻したい。しかし、 "ABCEDF"のような文字列を入れると、trueを返します。それは、それが最初の文字/インデックスのみをチェックしているようです。 forループとif文を使用して、入力された文字列が正しい基準を満たしているかどうかを確認し、それに応じてtrue/falseを返すにはどうすればよいですか?ループが完全に実行されない文がある場合C++

+0

if/elseがループ内で発生しています。最初の反復で常にtrueまたはfalseを返します。ループの完了後にfalseを返すことができます。 –

答えて

3

条件がtrueの場合は、trueを返します。条件がfalseの場合は、falseを返します。 ではない条件に分岐がありません。returnです。

あなたのコードは、言い換えれば

for (int k = 0; k != s.size(); k++) 
{ 
    return (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; 

あなただけ後にfalseを返します:私は推測があなたの代わりにこのような何かをしたいかもしれませんあなたは何をやっているんかしたいのかを正確に知らず


ループ。

+0

@thiskidduh 's'で部分文字列を探したい場合は、[' find'](http://en.cppreference.com/w/cpp/string/basic_string/find)関数を使います。 –

4

問題は、最初の文字がifにリストされているものかどうかを実際に確認していることです。 文字列にABCD以外の文字列が含まれているかどうかを判断するには、少なくとも入力文字列の文字ごとにを読み取る必要があるため、エラーはアルゴリズムです。 ABCDと異なるものを読むと、ループ内でtrueを返します。 文字列全体を読んでもまだ返されていない場合は、文字列がABCDであるため、falseを返すことができます。

プラスあなたは文字列は次のようにあなたは、どうかs[k]!=A && s[k]!=B && s[k]!=C && s[k]!=D

何かを確認する必要がありABCD以外の文字が含まれているかどうかを確認したい場合は、動作するはずです:

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; 
} 
0

あなたが本当にループを必要としませんこのタスクを実行するためのif文の束は、これを行う簡単な関数を書くことができます。コードのこのビットをチェックしてください!

#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; 
} 

は、この単純な関数を使用すると、それはあなたが2番目の文字列からに対してチェックしたい文字のセット以外の文字が含まれているかどうかを確認するために、任意の最初の文字列を確認することができます。これにより、if文の条件文で文字をハードコードする必要がなくなります。これはまた、任意の文字列を決定された文字のセットと比較する追加のボーナスを与えます。

関連する問題