如何从 std::string 中获取 2 个字符并将其转换为 C++ 中的 int?
Posted
技术标签:
【中文标题】如何从 std::string 中获取 2 个字符并将其转换为 C++ 中的 int?【英文标题】:How to take 2 characters from std::string and convert it to int in C++? 【发布时间】:2014-01-08 15:31:17 【问题描述】:在 C++ 中,我有一个字符串,例如 std::string string = "1234567890"
。
我有一个整数向量定义为std::vector<int> vec
我如何计算vec = stoi(string.at(1) + string.at(2))
,这样它会给我一个整数12
,我可以插入到这个向量中?
【问题讨论】:
stoi
返回一个整数。你想如何将它分配给vec
。我不明白你想做什么。
您想将整个字符串转换为一个数字,还是一次转换两个字符,或者究竟是什么?
我真的不明白这个帖子,标题可以写得更好:(
【参考方案1】:
据我了解,您希望将前 2 个字符作为字符串检索,将其转换为 int
并插入到向量中:
std::vector<int> vec;
std::string str = "1234567890";
// retrieve the number:
int i;
std::istringstream(str.substr(0,2)) >> i;
// insert it to the vector:
vec.push_back(i);
借助 C++11 支持,您可以使用 std::stoi
代替字符串流。
【讨论】:
std::stoi
是否需要 C++11 支持...?
@Mhd.Tahawi:是的,但是在 C++03 中也有 strtol
。
我使用了不同的 awnser,因为我不喜欢流的想法,但我确实在我的程序中使用了 C++11 方法 stoi 和 to_string。
@NictraSavios: 当然:)【参考方案2】:
使用字符串流:
#include <sstream>
std::stringstream ss(string.substr(0,2));
int number;
ss >> number;
【讨论】:
【参考方案3】:最简单的方法是提取子字符串而不是单个字符。使用operator +
连接它们,并在结果字符串上调用stoi
:
vec.push_back(stoi(string.substr(0, 1) + string.substr(1, 1)));
// vec now ends with 12
上面将连接源字符串中任意位置的字符串。如果您真的只需要提取连续字符,只需调用substr
即可:
vec.push_back(stoi(string.substr(0, 2)));
【讨论】:
既然他们一个接一个,vec.push_back(atoi(string.substr(0,2)))
会工作吗?
这取决于你想要什么。你的问题不清楚。
@NictraSavios 是的;我已经编辑了答案以明确这一点。
atoi(string.substr(0, 2).c_str())
= stoi(string.substr(0, 2))
(已在问题中使用)【参考方案4】:
正如我正确理解的那样,您希望从字符串的前两个字符形成一个整数。然后可以通过以下方式完成
std::vector<int> vec = ( ( s.length() >= 1 && is_digit( s[0] ) ) ? s[0] - '0' : 0 ) * 10 +
( ( s.length() > 1 && is_digit( s[1] ) ) ? s[1] - '0' : 0 ) ;
一般做法如下
std::string s = "123456789";
std::vector<int> v( 1, std::accumulate( s.begin(), s.end(), 0,
[]( int acc, char c ) return ( isdigit( c ) ? 10 * acc + c - '0' : acc ); ) );
std::cout << v[0] << std::endl;
您只需为字符串指定所需的迭代器范围。
【讨论】:
以上是关于如何从 std::string 中获取 2 个字符并将其转换为 C++ 中的 int?的主要内容,如果未能解决你的问题,请参考以下文章