C++ string 转整数

使用 sstream 完成转换,

 1 #include <iostream>
 2 #include <string>
 3 #include <sstream>
 4 #include <stdint.h>
 5
 6 int main ()
 7 {
 8   std::string str_integer;
 9   uint64_t integer;
10
11   std::getline(std::cin, str_integer);
12   std::stringstream ss;
13   ss.str(str_integer);
14   ss >> integer;
15   std::cout << __LINE__ << ":" << integer << std::endl;
16
17   return 0;
18 }

一次性转换较为容易,但是如果 std::stringstream 对象多次使用就要注意状态的清理,

 1 #include <iostream>
 2 #include <string>
 3 #include <sstream>
 4 #include <stdint.h>
 5
 6 int main ()
 7 {
 8   std::string str_integer;
 9   uint64_t integer;
10   std::stringstream ss;
11
12   str_integer = "1234";
13   ss.str(str_integer);
14   ss >> integer;
15   std::cout << __LINE__ << ":" << integer << std::endl;
16
17   str_integer = "12345";
18   ss.str(str_integer);
19   ss >> integer;
20   std::cout << __LINE__ << ":" << integer << std::endl;
21
22   return 0;
23 }

就会发现,第二次输出的值并不是 12345,而是 1234。

原因是第一次 ss >> integer 执行之后,ss 就被置上了 eof 标志,所以,第二次执行 ss >> integer 时,是不会输出的,integer 中保留了原来的 1234。下面的代码能够正确执行,

#include <iostream>
#include <string>
#include <sstream>
#include <stdint.h>

int main ()
{
  std::string str_integer;
  uint64_t integer;
  std::stringstream ss;

  str_integer = "1234";
  ss.str(str_integer);
  ss >> integer;
  std::cout << __LINE__ << ":" << integer << std::endl;

  str_integer = "12345";
  ss.str(str_integer);
  ss.clear();                // 加上这句就可以正确输出了
  ss >> integer;
  std::cout << __LINE__ << ":" << integer << std::endl;  

  return 0;
}

ss.clear() 就可以清除 eof 标志,ss >> integer 就能正确输出。

另外,如果想清除 stringstream 中原有的数据,使用下面的方法就可以保证正确执行,

ss.str("");        // 重置缓冲区数据
ss.clear();        // 不是必须的,但是保险起见

所以我们发现很多地方单独使用 ss.str("") 后续并没有得到正确输出,那就很可能是状态标志没有清除,而单独使用 ss.clear() 本是就达不到清楚缓冲区数据的目的,是错的。

时间: 2024-10-10 02:20:04

C++ string 转整数的相关文章

关于string转整数

又是leetcode的easy级别题,很基本的题目,却漏考虑很多情况,动手前一定要考虑清楚呀!!! 就当做锻炼写作能力吧,先上题目! 将文本转换成整数,注意一下几点: 1.文本里面第一个不为空白的字符应该为数字或‘+’.‘-’,否则返回0: 2.文本中数字后面的文本不影响结果; 3.转换后的值若超过了int的最值应返回最值. 上代码吧! class Solution { public: int myAtoi(string str) { int start = 0; for (int i = 0;

string和整数转换

tostring(int) fromstring(string ) c++11新方式 stod Convert string to double (function template ) stold Convert string to long double (function template ) stoi Convert string to integer (function template ) strtof Convert string to float (function )

字符char、字符串string、整数int之间的转换

#include <iostream> #include <string> #include <sstream> using namespace std ; void i2s(int x, string &basic_string) { stringstream ss; ss << x; ss >> basic_string; } void s2i(string &basic_string , int &x ) { str

大整数四则运算

============ 日后再写!先将设计思想留下 ============= 定义并实现超长整数类double long,要求如下: 64位数据长度,有符号 支持+.-.*./运算 支持+=.-=./=运算 支持cin>>和cout<<操作 首先,我们的运算对象是大整数并且要支持cout<<和cin>>操作,数组和链表是可选择项.在这里我们用数组.数组有int型和char型,选哪个好呢?只能选char型,因为我们的大整数是有符号位的,必须用一个char字

【算法设计与分析基础】大整数乘法

#include<iostream> #include<string> #include<time.h> #include<stdlib.h> #include<sstream> using namespace std; class BigDecimal{ private: int max(int a,int b){//获取两数中的最大值 return a^((a^b) & -(a<b)); } public: string n;

c++实现atoi()和itoa()函数(字符串和整数转化)

  c++实现atoi()和itoa()函数(字符串和整数转化) 一:起因 (1)字符串类型转化为整数型(Integer),还是字符串类型(String)转化为Double类型,这在java里面有非常好的内部函数,很easy的事情: (2)但是在c里面没有Integer Double等包装类,由char[]数组转化为整数型就变得不那么简单了,atoi()  itoa()在widows下面有,但是网上说linux 下好像没有 itoa() 函数,用 sprintf() 好了,但是本人测试了一下sp

大整数的加减乘除C++实现

大整数的乘法由于用分治法理解起来有点困难,就采用人的计算方法实现,大整数为string 类型,结果也为string类型. 大整数的除法采用先乘后减的方法,例如: 665/20 首先20*10=200:然后665去减200,通过循环计入减了3次,则结果记入3*10=30:然后20*1=20,上次减了之后还剩65,65-20,又减了3次,所以结果记入30+3*1=33:最后还剩5,比20小,则余数为5. 大整数的加法减法和人工打草稿过程类似,不做详细分析.实现代码仅供参考: 1 #include<i

用itoa()函数将整数转换为字符串

在C语言中提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子:atoi     把字符串转换成整型数itoa     把一整数转换为字符串 下面分享一下应用范例,可学习0基础C语言开发教程: #include "stdio.h" #include "ctype.h" #include "stdlib.h" /* Converts a character strin

tchar 输入输出类 和 string 类 函数简单说明 总结各种前缀后缀

标准输入输出printf类_tprintf : 类同printf_tprintf_l : 类同printf, 但是"_l"表示第二个参数是一个locale.locale是操作系统对语言设定的参数, 这个会影响ANSI字符的语言识别, 在Unicode下应该是无差别的_tprintf_s : 类图printf, 但是和_tprintf相比, _tprintf_s多会做一些检查工作.如果你的"format string"是动态的, 这个能帮助你._tprintf_s_l