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

which function should I use for split the string

本文关键字:分割 字符串 函数 我应该      更新时间:2023-10-16

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

2007年11月13日2008年9月23日2008年9月23日

并设置它的月份、日期和年份对象,我如何使用substr()函数,或者还有其他函数吗?

在您的情况下,我会使用好的旧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(), ...)。)

如果使用C++11,则可以使用<regex>库:

#include <iostream>
#include <regex>
#include <string>
int main() {
    std::string date = "1/1/1970";
    std::regex dateRegex("(\d\d?)/(\d\d?)/(\d{4})");
    std::smatch match;
    if (regex_match(date, match, dateRegex)) {
        std::cout << match.str(1) << std::endl;
        std::cout << match.str(2) << std::endl;
        std::cout << match.str(3) << std::endl;
    }
    else {
        // error
    }
    return 0;
}

对于您的情况来说,这可能有些过头了,但请记住,通过使用正则表达式,您也可以对输入进行某种形式的验证。在上面的例子中,如果您传递任何不具有dd/dd/dddd形式的东西,其中"d"是一个数字,您将输入"error"代码块。当然,99/99/9999将被视为有效输入,但您也可以使用更复杂的regex来解决这种情况。

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