OJ_3_字符串数字相互转换

题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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

原文地址:https://www.cnblogs.com/grooovvve/p/12364712.html