如何检查C ++中的字符串是否在字符串中?

时间:2014-05-02 16:43:53

标签: c++ string

好吧,我觉得这应该非常简单,但对于我的生活,我无法理解。我正在尝试编写一个函数来查找一个字符串中的字符,以用于一个hangman程序。因此,我想出了:

int drawHangman(char trY, string wordA)
{ 
        int wrongTries = 0,            
    if(wordA.find(trY) != string::npos)     //checking to see if char is in word
            wrongTries++;           //if its not, ++
    else
        wrongTries = wrongTries;        //if it is, do wrong tries remains the same
    return wrongTries;                      //return # wrong tries
}

Suggetions?

3 个答案:

答案 0 :(得分:5)

您已经找到了如何检查某个字符是否在给定字符串中(find函数)。保持简单:

bool isInside(const std::string & str, char c)
{
    return str.find(c) != std::string::npos;
}

尝试将每个任务分成一个执行一个简单操作的函数。查找字符是否在给定字符串中的函数应该只执行此操作。计算此函数返回false的次数是另一个函数的问题,因为这是一个无关的任务(与搜索无关)。

你的drawHangman函数应该专注于实际绘制刽子手,例如通过参数给出用户失败的次数。

答案 1 :(得分:1)

如果我理解正确,那么你需要的是以下

size_t drawHangman( const std::string &word, char c )
{ 
    static size_t wrongTries = 0;

    if ( word.find( c ) != std::string::npos )
    {
        return ( wrongTries = 0 );
    }
    else
    {
        return ( ++wrongTries );
    }
}

如果您需要重置wrongTries,可以使用某些任意值调用i,例如

drawHangman( " ", ' ' );

如果您不想按照我上面显示的方式调用函数来重置wrongTries,那么您可以通过以下方式定义它

size_t drawHangman( const std::string &word = " ", char c = ' ' )
{ 
    static size_t wrongTries = 0;

    if ( word.find( c ) != std::string::npos )
    {
        return ( wrongTries = 0 );
    }
    else
    {
        return ( ++wrongTries );
    }
}

你可以简单地称之为

drawHangman();

重置wrongTries。

如果您需要不区分大小写的搜索,则可以使用标准算法std::find_if。例如

#include <algorithm>

size_t drawHangman( const std::string &word, char c )
{ 
    static size_t wrongTries = 0;

    suto it = std::find_if( word.begin(), word.end(),
                            [=]( char t ) { return ( std::toupper( t ) == std::toupper( c ) ); } );

    if ( it != word.end() )
    {
        return ( wrongTries = 0 );
    }
    else
    {
        return ( ++wrongTries );
    }
}

另一方面,如果您需要计算字符串中不存在字符的所有情况,您可以按以下方式编写函数

int drawHangman( const std::string &word = "", char c = '\0' )
{ 
    static int wrongTries = 0;

    if ( word.empty() )
    {
         wrongTries = 0;
         return wrongTries;
    }

    if ( word.find( c ) != std::string::npos )
    {
        return ( -wrongTries );
    }
    else
    {
        return ( ++wrongTries );
    }
}

因此,您可以通过以下方式检查字符串中是否存在字符

if ( drawHangman( SomeString, SomeChar ) <= 0 )
{
   // the character is found in the string
}
else
{
   // the character is not found in the string
} 

如果您需要重置wrongTries,可以将该函数调用为

drawHangman();

答案 2 :(得分:1)

它会区分大小写,所以如果wordA =“space”(我将假设这个单词已全部为小写),你会找到'C',你将找不到'C'寻找'c'但会找到'c'。

您可以使用std::tolower确保trY字符设置较低,再次假设wordA已经是小写。*

bool IsValidLetter(char trY, const std::string& wordA)
{
    if (wordA.find(std::tolower(trY)) != std::string::npos)
    {
        return true;
    }
    return false;
}

注意我在这种情况下删除了wrongTries计数器,因为你只是测试(此时)字母中是否存在字母。

然后你想要保留一个容器,可能是一个向量,包含到目前为止已尝试过的所有字母,这可能是有用的伪代码。

int CountWrongLetters(attemptedLetters, wordA)
{
    int wrong = 0;
    foreach letter in attemptedLetters
    {
        if (IsValidLetter(letter, wordA) == false)
        {
            wrong++;
        }
    }
    return wrong;
}

其他地方会处理根据返回的数字绘制刽子手显示的每个部分的逻辑,以及结束游戏的逻辑。