C/C++字符串和数字互换方案收集

来源:互联网 发布:少年感的女生知乎 编辑:程序博客网 时间:2024/05/17 05:07

▲1、C语言标准库函数atoi()等。

函数名: atoi
功 能: 把字符串转换成整型数
用 法: int atoi(const char *nptr);
程序例:
#include <stdlib.h>
int main(void)
{
int n;
char *str = "435";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}

其他相关函数——

函数名: atof
功 能: 把字符串转换成浮点数
用 法: double atof(const char *nptr);
程序例:
#include <stdlib.h>
int main(void)
{
float f;
char *str = "12345.67";
f = atof(str);
printf("string = %s float = %f\n", str, f);
return 0;
}

函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr);
程序例:
#include <stdlib.h>
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}

▲2、sprintf与Format构造字符串——

sprintf和printf都是C的产物,用法几乎一样,只是前者打印到字符串,后者直接在命令行上输出。
int sprintf( char *buffer, const char *format [, argument] … );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串(想想printf吧,一样的)。

如:
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐

这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
sprintf(s, "%08X", 4567); //产生:"000011D7"
上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。

控制浮点数打印格式
浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保
留小数点后6 位数字,比如:
sprintf(s, "%f", 3.1415926); //产生"3.141593"
但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m 表
示打印的宽度,n 表示小数点后的位数。比如:
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
sprintf(s, "%-10.3f", 3.1415626); //产生:"3.142 "
sprintf(s, "%.3f", 3.1415626); //不指定总宽度,产生:"3.142

例:
#include <iostream>
int main()
{
    double a(3112);
    char s1[10],s2[10];
    sprintf(s1,"%d\n",(int)a);
    sprintf(s2,"$%.2lf",a);
    std::cout<<s1<<s2<<std::endl;
}

在C++里也可用Format(CString)
/*VS2005中,项目/属性/配置属性里字符集设置为未配置*/

解决方法:对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享DLL 中使用MFC”,就OK了~~~

使用CString类,需包含以下头文件(CString类是MFC中的类)
#include <iostream>
#include <afx.h>

#define _AFXDLL

int main()
{
    double a(32);
    CString s;
    s.Format(_T("$%.2lf"),a);
    std::cout<<s<<std::endl;
}

所以在VS2005 或者VS2008中,遇到一些输出等函数时,可能需要在前面加入一些符号

比如有:_T或者TEXT等等

▲3、字符串流stringstream供的转换和/或格式化。(

关于 mt.exe : general error c101008a: Failed to save the updated manifest to the file

    这个问题经常出现!其实并不是你的真正出现了什么问题,只是你的编译链接的时候编译器自身的问题而已!也许是VS2005 ,VS2008 的BUG吧,解决的方法:点class view中的工程,选右键,再点clean就可以了; 或者是 build->clean solusion也可以,就是如此的简单

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    int num(435);
    string s;
    ostringstream mystream;
    mystream<<num<<"\n";    /*创建一个名为mystream的ostringstream类型空对象,并将指定的内容插入该对象。此时mystream的内容是以下字符:435\n*/
    s=mystream.str();
    cout<<s;
}

 

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    string s("435");
    int num;
    istringstream mystream(s);
    mystream>>num;/*num=435*/
    cout<<num<<endl;
}

▲4、自己写函数。

/*串到数,实参如("435",&number)*/
void getnumber_from_string(char nums[],int *p)
{
    int i,k=strlen(nums);
    for(i=0,(*p)=0;i<k;++i)
    (*p)+=pow_10(k-i-1)*(*(nums+i)-48);
}
int pow_10(int k) /*10的k次方*/
{
    return (k==0?1:10*pow_10(k-1));
}

例子:

#include <iostream>
using namespace std;
void main()
{
 char str[10];     //用来保存结果的字符串
 int a=12;          //要转换的数字
  cout<<itoa(a,str,10)<<endl;             //这里的10是十进制 该函数返回一个 char*

  char *s;         //要转换的字符串
  double d;
  int i;
  s="123.12345";
  d = atof( s );//返回一个 float型
  cout<<d<<endl;
  i=atoi(s);                //返回一个int型
  cout<<i<<endl;

}

#include &lt;sstream&gt;
#Include &lt;string&gt;
string num2str(double i)
...{
        stringstream ss;
        ss&lt;&lt;i;
        return ss.str();
}

数字转字符串:
用C++的streanstream:
#include <sstream>
#Include <string>
string num2str(double i)
...{
        stringstream ss;
        ss<<i;
        return ss.str();
}
字符串转数字

int str2num(string s)
 ...{  
        int num;
        stringstream ss(s);
        ss>>num;
        return num;
}

string转char*

 

原创粉丝点击