我有一个来自命令行的字符串:
–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 ++库。
答案 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