如何将std::string转int,double? (C/C++) (C) (template)

本文介绍两种在C++中实现字符串与整数、浮点数互相转换的方法:使用C库函数atoi/atof结合c_str(), 以及利用stringstream进行模板化类型转换。这两种方法适用于Visual C++ 9.0/Visual Studio 2008环境。

原文地址:http://www.cnblogs.com/oomusou/archive/2006/10/10/525647.html

Abstract
std::string为library type,而int、double为built-in type,两者无法利用(int)或(double)的方式互转,本文提出轉換的方式。

Introduction
使用環境:Visual C++ 9.0 / Visual Studio 2008

Method 1:
使用C的atoi()與atof()。

先利用c_str()轉成C string,再用atoi()與atof()。

string_to_double.cpp / C++

复制代码
1  /*  
2  (C) OOMusou 2008  http://oomusou.cnblogs.com
3 
4  Filename    : string_to_double.cpp
5  Compiler    : Visual C++ 9.0 / Visual Studio 2008
6  Description : Demo how to convert string to int (double)
7  Release     : 08/01/2008 1.0
8  */
9 
10  #include  < iostream >
11  #include  < string >
12  #include  < cstdlib >
13 
14  using   namespace  std;
15 
16  int  main() {
17     string  s  =   " 123 " ;
18     double  n  =  atof(s.c_str());
19     // int n = atoi(s.c_str());
20    
21    cout  <<  n  <<  endl;
22  }
复制代码


Method 2:
利用stringstream

这里使用functon template的方式将std::string转int、std::string转double。

stringstream_to_double.cpp / C++

1 /* 
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename    : stringstream_to_double.cpp
5Compiler    : Visual C++ 8.0
6Description : Demo how to convert string to any type.
7Release     : 11/18/2006
8*/

9 #include <iostream>
10 #include <sstream>
11 #include < string>
12
13 template < class T> 
14 void convertFromString(T &,  const std:: string &);
15
16 int main()  {
17  std::string s("123");
18
19  // Convert std::string to int
20  int i = 0;
21  convertFromString(i,s);
22  std::cout << i << std::endl;
23
24  // Convert std::string to double
25  double d = 0;
26  convertFromString(d,s); 
27  std::cout << d << std::endl;
28
29  return 0;
30}

31
32 template < class T> 
33 void convertFromString(T &value,  const std:: string &s)  {
34  std::stringstream ss(s);
35  ss >> value;
36}
usr/include/c++/11/bits/basic_string.h:448:34: note: no known conversion for argument 1 from ‘uint64_t’ {aka ‘long unsigned int’} to ‘const std::allocator<char>’ 448 | basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT | ~~~~~~~~~~~~~~^~~ /usr/include/c++/11/bits/basic_string.h:439:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 439 | basic_string() | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:439:7: note: candidate expects 0 arguments, 1 provided In file included from amain.cpp:21: modbus_parser.h:160:21: error: no matching function for call to ‘std::__cxx11::basic_string<char>::basic_string(double&)’ 160 | value = static_cast<T>(double_val); | ^~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /usr/include/c++/11/string:55, from /usr/include/c++/11/bits/locale_classes.h:40, from /usr/include/c++/11/bits/ios_base.h:41, from /usr/include/c++/11/ios:42, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from amain.cpp:1: /usr/include/c++/11/bits/basic_string.h:638:9: note: candidate:template<class _InputIterator, class> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = _InputIterator; <template-parameter-2-2> = <template-parameter-1-2>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 638 | basic_string(_InputIterator __beg, _InputIterator __end, | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:638:9: note: template argument deduction/substitution failed: In file included from amain.cpp:21: modbus_parser.h:160:21: note: candidate expects 3 arguments, 1 provided 160 | value = static_cast<T>(double_val); | ^~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /usr/include/c++/11/string:55, from /usr/include/c++/11/bits/locale_classes.h:40, from /usr/include/c++/11/bits/ios_base.h:41, from /usr/include/c++/11/ios:42, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from amain.cpp:1: /usr/include/c++/11/bits/basic_string.h:600:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 600 | basic_string(basic_string&& __str, const _Alloc& __a) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:600:7: note: candidate expects 2 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:596:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 596 | basic_string(const basic_string& __str, const _Alloc& __a) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:596:7: note: candidate expects 2 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:592:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::initializer_list<_Tp>, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 592 | basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc()) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:592:45: note: no known conversion for argument 1 from ‘double’ to ‘std::initializer_list<char>’ 592 | basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc()) | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~ /usr/include/c++/11/bits/basic_string.h:565:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 565 | basic_string(basic_string&& __str) noexcept | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:565:35: note: no known conversion for argument 1 from ‘double’ to ‘std::__cxx11::basic_string<char>&&’ 565 | basic_string(basic_string&& __str) noexcept | ~~~~~~~~~~~~~~~^~~~~ /usr/include/c++/11/bits/basic_string.h:553:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ 553 | basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:553:7: note: candidate expects 3 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:533:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>’ 533 | basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:533:34: note: no known conversion for argument 1 from ‘double’ to ‘const char*’ 533 | basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()) | ~~~~~~~~~~~~~~^~~ /usr/include/c++/11/bits/basic_string.h:518:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ 518 | basic_string(const _CharT* __s, size_type __n, | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:518:7: note: candidate expects 3 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:500:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ 500 | basic_string(const basic_string& __str, size_type __pos, | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:500:7: note: candidate expects 4 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:484:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ 484 | basic_string(const basic_string& __str, size_type __pos, | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:484:7: note: candidate expects 3 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:469:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ 469 | basic_string(const basic_string& __str, size_type __pos, | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:469:7: note: candidate expects 3 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:456:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 456 | basic_string(const basic_string& __str) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:456:40: note: no known conversion for argument 1 from ‘double’ to ‘const std::__cxx11::basic_string<char>&’ 456 | basic_string(const basic_string& __str) | ~~~~~~~~~~~~~~~~~~~~^~~~~ /usr/include/c++/11/bits/basic_string.h:448:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 448 | basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:448:34: note: no known conversion for argument 1 from ‘double’ to ‘const std::allocator<char>&’ 448 | basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT | ~~~~~~~~~~~~~~^~~ /usr/include/c++/11/bits/basic_string.h:439:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 439 | basic_string() | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:439:7: note: candidate expects 0 arguments, 1 provided In file included from amain.cpp:21: modbus_parser.h:185:21: error: no matching function for call to ‘std::__cxx11::basic_string<char>::basic_string(__gnu_cxx::__alloc_traits<std::allocator<short unsigned int>, short unsigned int>::value_type&)’ 185 | value = static_cast<T>(processed_registers[0]); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /usr/include/c++/11/string:55, from /usr/include/c++/11/bits/locale_classes.h:40, from /usr/include/c++/11/bits/ios_base.h:41, from /usr/include/c++/11/ios:42, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from amain.cpp:1: /usr/include/c++/11/bits/basic_string.h:638:9: note: candidate:template<class _InputIterator, class> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = _InputIterator; <template-parameter-2-2> = <template-parameter-1-2>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 638 | basic_string(_InputIterator __beg, _InputIterator __end, | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:638:9: note: template argument deduction/substitution failed: In file included from amain.cpp:21: modbus_parser.h:185:21: note: candidate expects 3 arguments, 1 provided 185 | value = static_cast<T>(processed_registers[0]); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /usr/include/c++/11/string:55, from /usr/include/c++/11/bits/locale_classes.h:40, from /usr/include/c++/11/bits/ios_base.h:41, from /usr/include/c++/11/ios:42, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from amain.cpp:1: /usr/include/c++/11/bits/basic_string.h:600:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 600 | basic_string(basic_string&& __str, const _Alloc& __a) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:600:7: note: candidate expects 2 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:596:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 596 | basic_string(const basic_string& __str, const _Alloc& __a) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:596:7: note: candidate expects 2 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:592:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::initializer_list<_Tp>, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 592 | basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc()) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:592:45: note: no known conversion for argument 1 from ‘__gnu_cxx::__alloc_traits<std::allocator<short unsigned int>, short unsigned int>::value_type’ {aka ‘short unsigned int’} to ‘std::initializer_list<char>’ 592 | basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc()) | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~ /usr/include/c++/11/bits/basic_string.h:565:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 565 | basic_string(basic_string&& __str) noexcept | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:565:35: note: no known conversion for argument 1 from ‘__gnu_cxx::__alloc_traits<std::allocator<short unsigned int>, short unsigned int>::value_type’ {aka ‘short unsigned int’} to ‘std::__cxx11::basic_string<char>&&’ 565 | basic_string(basic_string&& __str) noexcept | ~~~~~~~~~~~~~~~^~~~~ /usr/include/c++/11/bits/basic_string.h:553:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ 553 | basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:553:7: note: candidate expects 3 arguments, 1 provided /usr/include/c++/11/bits/basic_string.h:533:7: note: candidate:std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>’ (near match) 533 | basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()) | ^~~~~~~~~~~~ /usr/include/c++/11/bits/basic_string.h:533:7: note: conversion of argument 1 would be ill-formed: In file included from amain.cpp:21: modbus_parser.h:185:21: error: invalid conversion from ‘__gnu_cxx::__alloc_traits<std::allocator<short unsigned int>, short unsigned int>::value_type’ {aka ‘short unsigned int’} to ‘const char*’ [-fpermissive] 185 | value = static_cast<T>(processed_registers[0]); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | __gnu_cxx::__alloc_traits<std::allocator<short unsigned int>, short unsigned int>::value_type {aka short unsigned int}
最新发布
09-19
### 将 `std::string` 转换为 `double` 在 C++ 中,可以使用多种方法将 `std::string` 类型的数据转换为 `double` 类型。以下是几种常见且有效的方法: #### 方法一: 使用标准库函数 `stod()` C++11 及之后的标准引入了可以直接用于字符串到数值类型转换的函数 `std::stod()`。 ```cpp #include <string> #include <iostream> int main() { std::string str = "123.45"; try { double d = std::stod(str); std::cout << "Converted string to double: " << d; } catch (const std::exception& e) { std::cerr << "Error converting string to double."; } return 0; } ``` 此方式简单易用,并能处理异常情况[^1]。 #### 方法二: 使用流操作符 (`istringstream`) 通过创建一个输入字符流对象并利用其提取运算符来完成转换工作。 ```cpp #include <sstream> #include <string> #include <iostream> int main(){ std::string s="789.65"; std::istringstream iss(s); double num=0; if(iss >> num){ std::cout<<"Conversion successful, result="<<num<<"\n"; }else{ std::cout<<"Failed conversion.\n"; } return 0; } ``` 这种方法同样适用于更复杂的解析场景[^2]。 #### 方法三: 利用模板函数实现通用转换逻辑 当需要频繁执行不同类型之间的相互化时,定义泛化的辅助工具可能是更好的选择之一。 ```cpp template<typename T> T Convert(const std::string& val) { std::stringstream ss(val); T ret; ss >> ret; return ret; } // Usage example: Convert<double>("-321.5"); ``` 上述代码片段展示了如何构建一个简单的模板化解决方案以支持不同目标类型的转换需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值