我应该使用哪个函数来分割字符串
which function should I use for split the string
我正在做一个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函数。
相关文章:
- 如何在C++中从字符串中分割字符
- 由cin中的字符串中未捕获空白引起的分割错误
- 按分度分割字符串
- 分割故障:核心倾倒C 矢量对字符串:
- 我应该使用哪个函数来分割字符串
- 如何使用STL分割字符串
- C++如何使用多个分隔符分割字符串流
- 根据分度分割字符串
- 在空格上有选择地分割字符串
- 分割字符串作为邻接矩阵索引
- 用空格分割字符串,但只得到第一个单词
- c++中使用换行符分割字符串
- Std::locale按特定字符分割字符串而不忽略它
- 分割字符串并在不同的分隔符之前获取值
- 如果字符串包含多个 ,如何在每25个换行符( )上分割字符串
- Regex每两个字符分割字符串
- c++中左边的分割字符串
- 在c++中使用字符串(搜索字符串,分割字符串,cout<<字符串)
- 分割字符串
- 使用getline和while循环分割字符串