• 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

  • 相关阅读:
    赠与今年的大学毕业生(胡适先生30年代的文章,仍不过时)
    统一管理磁盘上的开源代码
    生成sqlite导入库的做法
    提高二维矢量绘图效率之一般做法
    boost库命名规则的优点
    如何把腾讯微博挂到CSDN博客上
    fatal error C1902 Program database manager mismatch; please check your installation问题的解决
    智能指针变量做函数参数的一个值得注意的地方
    PC会消亡吗?
    软件制造问题的微软答案
  • 原文地址:https://www.cnblogs.com/grooovvve/p/12364712.html
Copyright © 2020-2023  润新知