6

我有这个字符串:

std::string date = "20121020";

我正在做:

std::cout << "** Date: " << date << "\n";
std::cout << "Year: " << date.substr(0,4) << "\n";
std::cout << "Month: " << date.substr(4,6) << "\n";
std::cout << "Day: " << date.substr(6,8) << "\n";

但我得到:

** Date: 20121020
Year: 2012
Month: 1020
Day: 20

注意月份应该是10,不是1020。立场是正确的,什么都试过了,是不是失败了?

4

3 回答 3

20
std::cout << "Month: " << date.substr(4,6) << "\n";

第二个论点是错误的。您正在指定,“给我作为6 个字符的子字符串,从位置 4 开始。”

你可能想要:

std::cout << "Month: " << date.substr(4,2) << "\n";
于 2012-10-10T19:39:54.040 回答
3

试试这个:

std::cout << "** Date: " << date << "\n";
std::cout << "Year: " << date.substr(0,4) << "\n";
std::cout << "Month: " << date.substr(4,2) << "\n";
std::cout << "Day: " << date.substr(6,2) << "\n";

我相信 substr 将 start 和length作为参数。

于 2012-10-10T19:40:35.987 回答
-1

http://www.cplusplus.com/reference/string/string/substr/

字符串 substr ( size_t pos = 0, size_t n = npos ) const;

pos 当前字符串对象中要用作子字符串起始字符的字符的位置。如果传递的位置超过了字符串的末尾,则会引发 out_of_range 异常。

n 子串的长度。如果此值会使子字符串跨越当前字符串内容的结尾,则仅使用直到字符串结尾的那些字符。npos 是 size_t 类型元素的最大可能值的静态成员常量值,因此,使用该值时,将 pos 和字符串末尾之间的所有字符用作初始化子字符串。

所以你在代码中的错误是你期望第二个参数是最后一个字符的位置而不是子字符串的长度。

于 2012-10-10T19:47:20.063 回答