2013-04-04 70 views
1

我试图分析此行解析字符串的strtok()

Completion_Time_Stamp = [email protected]:10:22(Eastern Daylight Time) 

而在另一个

token[0] = strtok(buf, " = "); // first token 

if (token[0]) // zero if line is blank 
{ 
    for (n = 1; n < 10; n++) 
    { 
    token[n] = strtok(0, " = "); // subsequent tokens 
    if (!token[n]) break; // no more tokens 
    } 
} 

输出把名字中的一个变量和值:

token[0] = Completion_Time_Stamp 
token[1] = [email protected]:10:22(Eastern 
token[2] = Daylight 
token[3] = Time) 

但我想要这样的事情:

token[0] = Completion_Time_Stamp 
token[1] = [email protected]:10:22(Eastern Daylight Time) 

我该如何做到这一点?多个分隔符?

+4

请记住,第二个参数是一组分隔符,它不是确切的分隔符。 – 2013-04-04 16:53:24

+1

哦,这就是为什么它使用空间和=作为分隔符 – dharag 2013-04-04 16:54:57

+0

你需要这个正则表达式,或boost :: tokenizer – 2013-04-04 16:55:37

回答

4

为什么不使用std::string中已有的功能,如使用findsubstr

喜欢的东西:

std::string str = "Completion_Time_Stamp = [email protected]:10:22(Eastern Daylight Time)"; 

auto delim_pos = str.find('='); 

std::string keyword = str.substr(0, delim_pos); 
std::string data = str.substr(delim_pos); 

注:分隔符(在我的例子delim_pos)的位置可能使得字符串时进行调整。

0

使用std :: string,使用参数“=”查找,然后使用substring来获取这两个字符串。

std::string str1 ="Completion_Time_Stamp = [email protected]:10:22(Eastern Daylight Time)"; 
std::string str2 = "="; 
std::string part1=""; 
std::string part2=""; 

unsigned found = str1.find(str2); 
if (found!=std::string::npos) 
{ 
    part1 = str1.substr(0,found-1); 
    part2 = str1.substr(found+2); 
} 

cout << part1 << "\n" << part2 <<endl; 

我有以下几点:

Completion_Time_Stamp//^^no space here and beginning of second part 
[email protected]:10:22(Eastern Daylight Time) 
+0

该解决方案在part1的末尾总是有额外的空间,part2的末尾会导致问题? – dharag 2013-04-04 17:03:17

+0

或者我将不得不添加修剪 – dharag 2013-04-04 17:03:45

+0

@dharag我测试了发布的代码,你是对的,第二个子字符串应该从找到的+2开始到字符串的末尾,而第一个应该被找到-1为了排除空间。我更新了发布的代码。 – taocp 2013-04-04 17:23:55

1

你应该只使用=作为分隔符,然后右键修剪和左修剪你的成绩获得令牌0干掉后右空间和左标记1上的空间。

+0

是的,我想到了这一点,“=”是用来避免添加修剪,因为从200多个参数这是唯一一个之间有空格,但我猜这是没有更好的解决方案。谢谢。 – dharag 2013-04-04 17:15:46