如何在c ++中找到字符串中子字符串的位置?

时间:2014-03-27 18:11:53

标签: c++ string

我有一个来自命令行的字符串:

–m –d Tue –t 4 20 –u userid

我将它保存为字符串:

string command;
for(int i=1; i<argc;i++){
    string tmp = argv[i];
    command += " "+ tmp + " ";
}

现在我想操纵这个字符串来查找是否有-u,如果有-u我想查看下一个值是否以 - 或者是名字开头。 (它可以只有-u或-u和用户名。在这个例子中有一个用户名)

if(command.find("-u",0)){  
    std::size_t found = command.find_first_of("-u");
    cout<<found<<endl;
}

输出为14,这不是正确的地方。我的工作是找到是否有-u,如果在-u之后是用户名或什么也没有,或者以 - 开头的另一个命令。我感谢任何想法或有效的代码。

编辑:我必须在另一台服务器上运行此代码,我不能使用任何库而不是内置的g ++库。

3 个答案:

答案 0 :(得分:2)

虽然肯定存在很多库来完成你想要实现的事情(请参阅问题下的评论),但如果你想坚持你的代码,你必须使用string.find而不是{{1 }}

string.find_first_of从第一个参数中搜索任何字符的第一个出现(所以find_first_of)。当它找到它时,它返回位置,因此在提供的例子中,它将返回&#34; 0&#34; (因为"-u"–m –d Tue –t 4 20 –u userid)开头。

如果你想从给定的位置搜索字符串,你可以给-一个参数来描述它应该从哪个位置开始:

find

所以,如果你想找到第一个&#34; - &#34;在&#34; -u&#34;之后,你会做:

size_t find (const string& str, size_t pos = 0) const;

答案 1 :(得分:0)

std::string::find_first_of()并不像您期望的那样工作:

  

在字符串中搜索与任何字符匹配的第一个字符       在其论点中指定。

你想要的是std::string::find(),其中:

  

在字符串中搜索指定序列的第一个匹配项       通过其论点。

但是你不会发明这个圈子,你应该使用一个已经实现的命令行选项库来解析或使用标准库getopt_long功能。

答案 2 :(得分:0)

少说更多代码!:)

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <string>

int main()
{
    const char *user = "–u";
    std::string s( "–m –d Tue –t 4 20 –u userid" );
    std::string userID;

    std::istringstream is( s );

    auto it = std::find( std::istream_iterator<std::string>( is ),
                         std::istream_iterator<std::string>(),
                         user );

    if ( it != std::istream_iterator<std::string>() )
    {
        ++it;
        if ( it != std::istream_iterator<std::string>() && ( *it )[0] != '-' )
        {
            userID = *it;
        }
    }

    std::cout << "userID = " << userID << std::endl;
}

输出

userID = userid