如何从字符串中间开始的子字符串
How to a sub-string from middle of a string
我有一个"YYYY-MM-DD"的字符串,并希望将该字符串转换为整数并将它们分别存储为年,月,日。我用了substr
并得到了年份,但我无法获得 MM 和 DD。
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int dayOfYear(string date)
{
for (int i = 0; i < date.size(); i++)
{
if (date[i] == '-')
date.erase(date.begin()+i);
}
//getting substring for year
string str1 = date.substr(0, 4);
string str2 = date.substr(5, 6);//getting wrong output
//converting string to int
int year = stoi(str1);
int month = stoi(str2);
return month;//getting output as 109
}
int main()
{
string date = "2019-01-09";
int p = dayOfYear(date);
cout << p;
return 0;
}
>string::substr
的第二个参数应该是计数 -- 要包含在返回字符串中的字符数。
删除-
后,date
"20190109"
。你从位置4
开始,从日期开始2
字符。用
string str2 = date.substr(4, 2);
您没有正确使用std::string::substr()
。你给它两个索引(和错误的索引(,但它需要一个索引和一个计数。
没有必要erase()
-
字符(此外,你的循环无论如何都会中断,因为你不会在每次erase()
后重新调整i
,所以你跳过了字符(。可以使用std::string::find()
查找-
字符的索引,然后使用这些索引计算std::string::substr()
所需的值。
int yearOfDate(std::string date)
{
size_t ends = date.find('-');
//getting substring for year string
string str = date.substr(0, end);
//converting string to int
return std::stoi(str);
}
int monthOfDate(std::string date)
{
size_t start = date.find('-') + 1;
size_t end = date.find('-', start);
//getting substring for month string
string str = date.substr(start, end - start);
//converting string to int
return std::stoi(str);
}
int dayOfDate(std::string date)
{
size_t start = date.find('-');
start = date.find('-', start + 1) + 1;
//getting substring for day string
string str = date.substr(start);
//converting string to int
return std::stoi(str);
}
int main()
{
string date = "2019-01-09";
int y = yearOfDate(date);
int m = monthOfDate(date);
int d = dayOfDate(date);
std::cout << y << ' ' << m << ' ' << d;
return 0;
}
由于您使用的是 C++11 或更高版本(通过使用std::stoi()
(,请考虑改用std::get_time()
:
#include <sstream>
#include <iomanip>
#include <ctime>
int main()
{
string date = "2019-01-09";
std::tm t = {};
std::istringstream(date) >> std::get_time(&t, "%Y-%m-%d");
int y = tm.tm_year + 1900;
int m = tm.tm_mon + 1;
int d = tm.tm_mday;
std::cout << y << ' ' << m << ' ' << d;
return 0;
}
在 C++20 中,您可以改用std::chrono::from_stream(std::chrono::year_month_day)
:
#include <sstream>
#include <chrono>
int main()
{
string date = "2019-01-09";
std::istringstream iss(date);
std::chrono::year_month_day ymd;
std::from_stream(iss, "%Y-%m-%d", ymd);
unsigned y = ymd.year();
unsigned m = ymd.month();
unsigned d = ymd.day();
std::cout << y << ' ' << m << ' ' << d;
return 0;
}
相关文章:
- 从末尾开始的字符串中获取反向子字符串
- 我如何使它,无论用户用空白字符串按 Enter 多少次,它总是打印"开始"字符串?
- 如何修复我的编码,刚开始使用字符串
- 如何将从第 2 个字符开始的字符串作为函数中的参数传递以进行递归,并约束数据 tiee 是函数中的字符串?
- 尝试查找从索引 0 开始的偶数长度子字符串
- 如何从字符串中间开始的子字符串
- 在字符串开始时删除某些字符
- 当给定一个字符串时,Cout 在行首开始打印
- c 字符串开始时ASCII值是什么
- c++ UTF-8 字符串 erro 从 10xxx 开始,带有 cpprestsdk
- 在匹配另一个模式的字符串中找到最短子字符串的开始和结尾索引
- 如何将SSCANF()设置为在字符串开始时忽略字符
- gvim 换行应该结束当前字符串并在下一行开始一个新的字符串
- 返回从字符串末尾 (C++) 之后的位置开始的子字符串
- 字符串文本的C++宏开始迭代器和结束迭代器
- 当试图在ostringstream中连接一个字符串时,这些字符串的内容会被修改和重构,字符串会在开始时被添加
- 如何读取从特定索引开始的字符串
- 一个字符串开始另一个字符串是什么意思?c++
- 如何在c++中检查字符串开始
- 我如何写一个Qt正则表达式来突出显示字符串开始和结束与非单词字符