使用str :: find和find_first_of以及last_of

时间:2014-02-03 10:11:38

标签: c++ find

我不确定我是否正确使用了find_first和last_of,但我想要做的是当我在代码的开头或结尾找到_时,以及当它找到两个或更多时,我需要打印错误_彼此相邻,如此lol___, lol__lol, _lol_, _lol, lol_,和另外一条规则,_不能在大写字母前面,如lol_Lol

这是我的代码

             std::string::size_type n;
             std::string::size_type n2;
             std::string::size_type n3;
             std::string const ss = slovo;

             n  = ss.find('_');
             n2 = ss.find_first_of('_');
             n3 = ss.find_last_of('_');

            if (n2 == std::string::npos && n3 == std::string::npos) {
            cout << "chyba" << endl;
            }else if(n == std::string::npos){

                  string s = transform(slovo);
                  cout << s << endl;

                  }else{
                  string s = untransform(slovo);
                  cout << s << endl;

                  }

编辑&gt;

if ( !ss.empty() && ss.front() == '_' && ss.back() == '_' )
               {
                cout << "Chyba" << endl;
               } else {

                if ( ss.length() > 3 && ss.find( '__', 1, ss.length() - 2 ) != std::string::npos )
                {

                 if (n == std::string::npos){

                      string s = transform(slovo);
                      cout << s << endl;

                      }else{
                      string s = untransform(slovo);
                      cout << s << endl;

                      }
                }else{
            cout << "chyba" << endl;

         } 
         }

EDIT2:

cin >> slovo;
             }      
             std::string::size_type n;
             std::string const ss = slovo;

             n  = ss.find('_');

             // kontrola podtrznika

           if ( ss.empty() && ss[0] == '_' && ss[ss.length() - 1] == '_' )
           {
            cout << "chyba" << endl;
            }

           if ( ss.length() > 3 && ss.find( "__", 1, ss.length() - 2 ) != std::string::npos )
           {
            cout << "chyba" << endl;
            }

             if (n == std::string::npos)
                 {
                  string s = transform(slovo);
                  cout << s << endl;

                  }else{
                  string s = untransform(slovo);
                  cout << s << endl;
                 }

2 个答案:

答案 0 :(得分:2)

如果这些函数返回npos,则意味着在字符串中找不到该字符。因此,如果其中一个返回,则所有3个都将返回。

因此,此代码输出'chyba',字符串中没有_,否则调用untransform。根据你的描述,这不是你想要的。

您确实需要扫描所有这些条件的字符串。如果您想检查字符串的第一个和最后一个字符,请使用ss[0]ss[ss.length() - 1](请注意,您没有长度为0或1的字符串)。

答案 1 :(得分:0)

很明显,这两个函数调用会给你相同的结果

         n  = ss.find('_');
         n2 = ss.find_first_of('_');

在这种情况下,它们是等价的。

如果我理解正确,你需要确定一个字符串中的第一个和最后一个字符是否为下划线,以及该字符串是否包含两个相邻的非本地字符。

要确定第一种情况,写起来很简单

if ( !ss.empty() && ss.front() == '_' && ss.back() == '_' )
{
//...
} 

要查找至少两个相邻的下划线,不包括您可以编写的第一个和最后一个字符

if ( ss.length() > 3 && ss.find( "__", 1, ss.length() - 2 ) != std::string::npos )
{
//...
}