C++中不同类型数据之间的转换(调用库函数)

来源:互联网 发布:电钢琴 耳机 知乎 编辑:程序博客网 时间:2024/05/21 01:29

C++标准库为我们提供了不少库函数用以支持数据类型的转换,总结了以下几个:

1.sprintf函数

      在将各种类型的数据构造成字符串时,sprintf 的功能很强大。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。

       sprintf 是个变参函数,定义如下:
        int sprintf( char *buffer, const char *format [, argument] ... );
  除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数;

       例如:sprintf(s, "%d", 123); //产生"123"

                  sprintf(s, "%f", 3.1415926); //产生"3.141593"

                  sprintf(s, "%.2f", i);   //错误

                 sprintf(s, "%.2f", (double)i); //错误

       错误原因分析:参数压栈时调用者并不知道跟i相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当年被压入栈里的是个整数,于是保存整数i 的那4 个字节就被强行作为浮点数格式来解释了,这样就整个乱套了。

2.stringstream对象

       由于数据的类型在编译期就确定了,所以编译器拥有足够的信息来判断需要哪些转换。<sstream>库中声明的标准类就利用了这一点,自动选择所必需的转换。而且,转换结果保存在stringstream对象的内部缓冲中。你不必担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。

        <sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,以stringstream为中心,因为每个转换都要涉及到输入和输出操作。

       注意:

     (1)<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。     

      (2)如果打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;

      (3)在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。

        例子:

      #include <iostream>  
      #include <string>  
      #include <sstream> 
      using namespace std;
      string D2S(double Input) 
      { 
          stringstream Oss; 
          Oss<<Input; 
          return Oss.str(); 
      } 

      double S2D(string Input) 
      { 
          double Result; 
          stringstream Oss; 
          Oss<<Input; 
          Oss>>Result; 
          return Result; 
      }

     int main() 
     { 
          double Str_1 = 12345.56789; 
          string Str_2 = "12345.56789";   
          cout<<"Double --> String"<<endl; 
          cout<<D2S(Str_1)<<endl; 
          cout<<"String --> Double"<<endl; 
          cout<<S2D(Str_2)<<endl;
     }

     另外也可以写个适用于各种类型转换的模板

    template<class out_type,class in_value>  out_type convert(const in_value & t)

    {

           stringstream stream;

           stream<<t;//向流中传值

           out_type result;//这里存储转换结果

          stream>>result;//向result中写入值

          return result;

    }

    使用convert()方法:

    double d;

    string salary;

    string s=”12.56”;

    d=convert<double>(s);//d等于12.56

    salary=convert<string>(9000.0);//salary等于”9000“

3.atoi、atof之类的函数

   常用的有:atol 、strtol、 strtod 、strtoul。。。用法类似,可能有重载的情况。

   例子1:

    main()

    {

         char *a=”-100.23”;

         char *b=”200e-2”;

         float c;

         c=atof(a)+atof(b);     //atof  :字符串型转换为浮点型 

         printf(“c=%.2f\n”,c);

    }  

    执行结果:c=-98.23

    例子2: 

    main()

    { 

         char a[]=”1000000000”; 

         char b[]=”1000000000”;

         char c[]=”ffff”;

         printf(“a=%d\n”,strtod(a,NULL,10));    //按十进制转换

         printf(“b=%d\n”,strtod(b,NULL,2));      //按二进制转换

        printf(“c=%d\n”,strtod(c,NULL,16));     //按十六进制转换

    }

    执行结果:

    a=1000000000

    b=512

    c=65535

原创粉丝点击