我应该使用哪个函数来分割字符串

时间:2016-05-02 13:28:05

标签: c++ substr string-parsing

我正在做一个Date类,它将string作为参数,如:

11/13/2007  
9/23/2008  
9/23/2008

...并设置月份,日期和年份对象,如何使用substr()功能,还是有其他功能?

2 个答案:

答案 0 :(得分:2)

在你的情况下,我会使用好的旧C(!)sscanf函数:

unsigned int year, month, day;
char c;
if(sscanf(input, "%u/%u/%u%c", &month, &day, &year, &c) == 3)
{
    // check ranges of your date variables!
}

您似乎使用美国日期格式,因此我相应地设置参数。

想知道我为什么要读一个额外的角色?它会在日期字符串末尾捕获其他数据以检测无效格式(如果数据跟随,结果将为4,否则,只读取3个值,将返回)。一个缺点:在三个数字之前,空格被忽略,所以如果你想要禁止,你需要额外的检查(例如"%n %n%u"并比较,如果两个相应的值相等)。

请参阅sscanf文档(参数scanf)。

(如果您的输入是::std::string个实例,当然需要使用sscanf(input.c_str(), ...)。)

答案 1 :(得分:1)

如果您使用的是C ++ 11,则可以使用import org.viz.lightning._ var viz: Visualization = _ //... val lgn = Lightning(host="http://localhost:3000") lgn.createSession("streamingtest") // initialization val series = Array.fill(1)(Array.fill(1)(r.nextInt(1))) viz = lgn.lineStreaming(series) // ... // adding new data (THIS DATA IS NOT SENT TO THE SERVER) val newdata: Map[String, Any] = Map("1" -> 1.0) viz.append(newdata) 库:

<regex>

这可能对你的情况来说太过分了,但请记住,通过使用正则表达式,你也可以对输入进行某种形式的验证。在上面的示例中,如果您传递的内容不是dd / dd / dddd,其中&#34; d&#34;是一个数字,你将输入&#34;错误&#34;代码块。当然,99/99/9999将被视为有效输入,但您也可以使用更复杂的正则表达式来解决这种情况。

使用分隔符解析字符串的另一个选项是使用getline函数。