标准C和C++库提供了一些转换工具。但是它们在易用性、扩展型和安全型上各有不同。 例如,以atoi为代表的一系列标准C函数就有一些限制: * 只支持单向转换:从文本到内部数据类型。要用C库函数实现另一个方向的转换,要么使用不太方便并且有损安全性的sprintf,要么牺牲可移植性,使用非标准函数,例如itoa。 * 支持的类型只是内建数值类型的一个子集,即int、long和double。 * 支持的类型不能用统一的方式扩展。例如从字符串表示转为complex或者rational。 以strtol为代表的标准C函数也有同样的基本限制,但它们对转换过程提供了更好的控制。然而,通常情况下这样的控制既不需要也没人用。scanf系列函数甚至提供了更多的控制,但同样缺少安全性和易用性。 标准C++库为这种转换提供了stringstream。它提供了大量格式控制,并且可以通过以文本中介进行任意类型之间的转换。但是对于简单转换,直接用stringstream可能显得很笨拙(引入额外的局部变量,并失去了嵌在表达式里使用的方便性),或者很难懂(在表达式里创建stringstream的临时对象)。Facets为控制文本的表现形式提供了全面的概念和机制,但是它相对较高的门槛使简单转换也牵涉到太深的技术。 lexical_cast模板函数提供了方便而且统一的形式来进行任意类型(当它们可以表示为文本)之间的转换。因为你可以把这种转换方便地写在表达式内,所以它可以简化你的程序。对于更复杂的转换,例如需要对精度或者格式作一些比lexical_cast缺省行为更严格的控制时,那么还是建议你用常规的stringstream方法。如果是数值到数值的转换,numeric_cast的行为要比lexical_cast更合理些 #include<stdio.h> #include<stdlib.h> #include<string.h> int tonum(char *string) { int n=0,i; if(*string=='-') i=-1; else i=1; while(!(*string>='0'&&*string<='9')) string++; while(*string>='0'&&*string<='9') { n*=10; n+=*string-'0'; string++; } return n*i; } char * tostring(int n,char *p) { char *q; char *str=(char*)malloc(20); if(p==NULL) return NULL; if(n<0) { strcpy(str,"-"); n=abs(n); } else strcpy(str,""); p[0]=n/10000+'0'; n=n%10000; p[1]=n/1000+'0'; n=n%1000; p[2]=n/100+'0'; n=n%100; p[3]=n/10+'0'; n=n%10; p[4]=n+'0'; p[5]='