题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0
溢出判断是难点;
符号的判断,非数字符号的判断;
空字符串的处理;
//+-只能出现在开头,如果没有+-,默认为正数;
//此外如果有非数字,则直接返回0;
1 class Solution { 2 public: 3 int StrToInt(string str) { 4 int flag = 1; 5 int res = 0; 6 int temp; 7 if(str.length()==0) //空字符串 8 return 0; 9 if(str[0]=='-') 10 flag = -1; 11 for(int i = 0; i<str.length(); i++) 12 { 13 if(str[i]<'0' || str[i]>'9'){ //非数字 14 if(i==0 && (str[i]=='+' || str[i]=='-')){ //只允许i=0出现+或者- 15 continue; 16 } 17 else{ 18 return 0; 19 } 20 } 21 else{ 22 //int 十进制:-2^31=-21 4748 3648 到 2^31-1=21 4748 3647。共10位,21亿。 23 int digit = (int)(str[i]-'0'); 24 temp = res*10 + digit; 25 //注意还要判断res*10是否溢出 ,之后再判断加上digit是否溢出 26 //向上溢出判断 INT32_MAX < res*10 + digit 27 if(flag == 1 && (res>INT32_MAX/10 || res*10 > INT32_MAX-digit)) 28 return 0; 29 //向下溢出判断 INT32_MIN > res*10*(-1) - digit 30 if(flag == -1 && (res*flag<INT32_MIN/10 || res*10*flag < INT32_MIN+digit)) 31 return 0; 32 res = temp; 33 } 34 35 } 36 return flag*res; 37 } 38 };
此外还可以写一个函数,实现数字转字符串 IntToStr
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 5 using namespace std; 6 7 8 class Solution { 9 public: 10 string IntToStr(int num){ 11 string res; 12 int flag = 1; //flag==1正数,flag==-1负数 13 if(num<0){ 14 flag = -1; 15 num = flag*num; 16 } 17 else if(num==0){ 18 res = '0'; 19 return res; 20 } 21 22 23 while(num){ 24 char digit =(char)((num % 10)+'0'); 25 res = digit + res; 26 num /= 10; 27 } 28 29 if(flag== -1) 30 res = '-'+res; 31 return res; 32 } 33 }; 34 35 int main() 36 { 37 Solution sol; 38 int n; 39 while(cin>>n){ 40 cout<<sol.IntToStr(n)<<endl; 41 } 42 43 return 0; 44 }
C++中直接利用库函数或者类实现字符串转数字、数字转字符串;
在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用<sstream>。
1、数字转字符串:
1.1、使用stringstream:
1 int main() 2 { 3 stringstream ss; 4 5 int input_num = 1000; 6 string output_string; 7 8 ss << input_num; 9 ss >> output_string; 10 cout<<output_string<<endl; 11 return 0; 12 }
1.2、使用to_string库函数:
c++11标准增加了全局函数std::to_string:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
2、字符串转数字:
2.1、使用istringstream:
1 int main() 2 { 3 istringstream is("123"); 4 int i; 5 is>>i; 6 cout<<i<<endl; 7 return 0; 8 }
================================================
相关链接:
C++ int与string的相互转换:https://www.cnblogs.com/smile233/p/8379802.html
stringstream介绍:https://blog.csdn.net/joeblackzqq/article/details/7032703