分析分隔字符串

Parse delimited string

本文关键字:字符串 分隔      更新时间:2023-10-16

我怎样才能得到:

connect
100
username
example

从这个字符串:

ngg://connect>100/username>example/

std::string::find 与参数一起使用 "/"">"std::string::substr 与找到的索引

这是一个良好的开端。

为了多样性,添加带有strtok的答案:

char str[] = "ngg://connect>100/username>example/";
char *s = strtok(str, ">/");
std::vector<std::string> tokens;
while (s = strtok(NULL, ">/"))
    tokens.push_back(std::string(s));

这会将字符串str拆分为所需的标记(丢弃第一个ngg:,如问题中所示)。
下面是此代码的工作示例。

一种可能性是boost::split()

#include <iostream>
#include <vector>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/split.hpp>
int main()
{
    std::vector<std::string> tokens;
    std::string s("ngg://connect>100/username>example/");
    boost::split(tokens, s, boost::is_any_of("/>"));
    // "connect"  == tokens[2]
    // "100"      == tokens[3]
    // "username" == tokens[4]
    // "example"  == tokens[5]
    return 0;
}
ngg://connect>100/username>example/

如果此格式是固定的,则可以将std::sscanf用作:

#include <iostream>
#include <cstdio>
int main()
{
   char const *input = "ngg://connect>100/username>example/";
   char const *input_format = "ngg://%[^>]>%d/%[^>]>%[^/]"; 
   char connect[100], user[100], str[100]; //assuming max size is 100
   int num;
   if ( std::sscanf(input, input_format, connect, &num, user, str) != 4 )
   {
     std::cerr<<"error - number of tokens read must be equal to 4";
     return 0; 
   }  
   std::cout << connect <<std::endl;
   std::cout << num <<std::endl;
   std::cout << user <<std::endl;
   std::cout << str <<std::endl;
}

输出(在线演示):

connect
100
username
example