zoukankan      html  css  js  c++  java
  • 20090521 10:32 c++ int/string转换

    1. int to string

    一、使用atoi

    说明:

    itoa(   int   value,   char   *string,   int   radix   );  
        第一个参数:你要转化的int;  
        第二个参数:转化后的char*;  
        第三个参数:你要转化的进制;  

    举例:

    //-------------------------------------  
    //功能:C++ int 转 string (使用atoi)   
    //环境:VS2005  
    //-------------------------------------  
    
    
    #include "stdafx.h"  
    #include <iostream>  
    using namespace std;  
    
    
    int main(int argc, char* argv[])  
    {  
        int n = 30;    
        char c[10];  
          
        itoa(n, c, 2);  
        cout << "2-> " << c << endl;  
    
    
        itoa(n, c, 10);  
        cout << "16-> " <<  c << endl;  
    
    
        itoa(n, c, 16);   
        cout << "10-> " <<  c << endl;  
    
    
        system("pause");  
        return 0;  
    }

    输出:

    2-> 11110  
    16-> 30  
    10-> 1e  
    请按任意键继续. . .

    二、使用sprintf

    头文件 #include<stdio.h>

    语法: int sprintf(string format, mixed [args]...);

    返回值:字符串长度(strlen)

    转换字符

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    % 印出百分比符号,不转换。

    b 整数转成二进位。

    c 整数转成对应的 ASCII 字元。

    d 整数转成十进位。

    f 倍精确度数字转成浮点数。

    o 整数转成八进位。

    s 整数转成字串。

    x 整数转成小写十六进位。

    X 整数转成大写十六进位。

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    举例:

    //-------------------------------------  
    //功能:C++ int 转 string (使用sprintf)   
    //环境:VS2005  
    //-------------------------------------  
    
    
    #include "stdafx.h"  
    #include <iostream>  
    #include <string>  
    using namespace std;  
    
    
    int main()  
    {  
        int n = 30;  
        char c[20];  
    
    
        sprintf(c, "%d", n);      
        cout << c << endl;  
    
    
        sprintf(c, "%o", n);      
        cout << c << endl;  
    
    
        sprintf(c, "%X", n);      
        cout << c << endl;  
    
    
        sprintf(c, "%c", n);      
        cout << c << endl;  
    
    
        float f = 24.678;  
        sprintf(c, "%f", f);      
        cout << c << endl;  
    
    
        sprintf(c, "%.2f", f);      
        cout << c << endl;  
    
    
        sprintf(c, "%d-%.2f", n, f);  
        cout << c << endl;  
    
    
        system("pause");  
        return 0;  
    }  

    输出:

    30  
    36  
    1E  
    //注:这里是个特殊符号  
    24.677999  
    24.68  
    30-24.68  
    请按任意键继续. . .

    三、使用stringstream

    举例:

    //-------------------------------------  
    //功能:C++ int 转 string (使用stringstream)   
    //环境:VS2005  
    //-------------------------------------  
    
    
    #include "stdafx.h"  
    #include <iostream>  
    #include <string>  
    #include <sstream>  
    using namespace std;  
    
    
    int main()  
    {  
        stringstream strStream;  
        int a = 100;  
        float f = 23.5566;  
    
    
        strStream << a << "----"<< f ;  
        string s = strStream.str();  
        cout << s << endl;  
    
    
        system("pause");  
        return 0;  
    }  

    输出:

    100----23.5566  
    请按任意键继续. . .

    四、其它

    1.sprintf可能引起缓冲区溢出,可以考虑使用 snprintf 或者非标准的 asprintf

    2.如果是mfc程序,可以使用 CString::Format

    3.如果使用boost,则可以直接使用: string s = boost::lexical_cast <string>(a);

    4.atoi 也是不可移植的。

    五、其它NB方法

    //-----------------------------------------------------------------------------------

    // 参考引用 :

    // http://baike.baidu.com/view/982195.htm?fr=ala0_1_1

    // http://baike.baidu.com/view/1295144.htm?fr=ala0_1

    // http://pppboy.blog.163.com/blog/static/3020379620085511954382/

    //-----------------------------------------------------------------------------------

    2. string to int

    //第一种方法

    const char* str = "123";
    int i;
    if(sscanf(str, "%d", &i) == EOF )
    {   /* error */}

    //第二种方法----C++ with standard library stringstream:

    int str2int (const string &str)
    {
       stringstream ss(str);
       int num;
       if((ss >> num).fail())
       {       //ERROR  
       }
       return num;
    }

    //第三种方法----With boost library:

    #include <boost/lexical_cast.hpp>
    #include <string>
    try{   
       std::string str = "123";   
       int number = boost::lexical_cast< int >( str );
    }catch( const boost::bad_lexical_cast & )
    {    // Error
    }

    =============My Test========================


    #include "stdafx.h"
    #include <cstdio>
    #include <iostream>
    #include <strstream>
    #include <string>
    #include <sstream>

    using namespace std;

    template<class NumType>
    bool ConvetStringToNumber(const string& str, NumType& num)
    {
    stringstream strStream(str);

    if((strStream>>num).fail())
    {
       cout<<"Sorry, convert failed!"<<endl;
       return false;
    }
    return true;
    }

    template<class NumType>
    bool ConvetNumberToString(const NumType& num, string& str)
    {
    stringstream strStream;
    strStream<<num;
    strStream>>str;   //str = strStream.str(); is ok too.
    return true;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
    string strNum = "22.56";
    float fNum;
    if(ConvetStringToNumber(strNum, fNum))
    {
       cout<<"fNum = "<<fNum<<endl;
    }

    double dNum;
    if(ConvetStringToNumber(strNum, dNum))
    {
       cout<<"dNum = "<<dNum<<endl;
    }

    int iNum;
    if(ConvetStringToNumber(strNum, iNum))
    {
       cout<<"iNum = "<<iNum<<endl;
    }

    string aa="abc";
    if(ConvetStringToNumber(aa, iNum))
    {
       cout<<"iNum = "<<iNum<<endl;
    }

    string str;
    ConvetNumberToString(fNum, str);
    cout<<"str from fNum = "<<str<<endl;
    ConvetNumberToString(dNum, str);
    cout<<"str from dNum = "<<str<<endl;
    ConvetNumberToString(iNum, str);
    cout<<"str from iNum = "<<str<<endl;


    char c;
    cin>>c;
    return 0;
    }

    Output is :

    fNum = 22.56
    dNum = 22.56
    iNum = 22
    Sorry, convert failed!
    str from fNum = 22.56
    str from dNum = 22.56
    str from iNum = 22

  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/lidabo/p/2801974.html
Copyright © 2011-2022 走看看