标准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=,i;
if(*string=='-')
i=-;
else
i=;
while(!(*string>=''&&*string<=''))
string++;
while(*string>=''&&*string<='')
{
n*=;
n+=*string-'';
string++;
}
return n*i;
}
char * tostring(int n,char *p)
{
char *q;
char *str=(char*)malloc();
if(p==NULL)
return NULL;
if(n<)
{
strcpy(str,"-");
n=abs(n);
}
else
strcpy(str,"");
p[]=n/+'';
n=n%;
p[]=n/+'';
n=n%;
p[]=n/+'';
n=n%;
p[]=n/+'';
n=n%;
p[]=n+'';
p[]='\0';
q=p;
while(*q!='\0'&&*q=='')
q++;
if(*q=='\0')
return p;
strcpy(p,q);
if(!strcmp(str,"-"))
{
strcat(str,p);
strcpy(p,str);
}
free(str);
return p;
}
int main()
{
char *string=new char[];
strcpy(string,"-123");
printf("%d\n",tonum(string));
printf("--------------------------\n");
printf("%s",tostring(-,string));
getchar();
delete string;
return ;
} #include <windows.h>
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void int2str(int n,char * &p);
void str2int(const char *str,int& num);
int main()
{
//int to string
int num;
char* p=NULL;
cout<<"input a num:";
cin>>num;
int2str(num,p);
cout<<p<<endl;
//string to int
char arr[];
char *buf=arr;
cout<<"input a string that is num:";
cin>>buf;
int n=;
str2int(buf,n);
cout<<n;
system("pause");
return ;
}
void int2str(int n,char * &p)
{
int i=,len=;
char buf[];
memset(buf,,sizeof(buf)/sizeof(buf[]));
int temp=(n<?\
-n:n);
while(temp)
{
buf[i++]=temp%+'';
temp=temp/;
}
len=i;
if(n<)
{
p=(char *)malloc(len*sizeof(char)+);
p[]='-';
for(i=len-;i>=;i--)
{
p[len-i]=buf[i];
}
p[len+]='\0';
}
else
{
p=(char *)malloc(len*sizeof(char)+);
for(i=len-;i>=;i--)
{
p[len-i-]=buf[i];
}
p[len]='\0';
}
}
void str2int(const char *str,int& num)
{
const char *p=str;
int temp=;
if(*p>''||*p<'')
++p;
int len=strlen(p);
for(int i=;i<len;i++)
{
temp=temp*+(*p++ - '');
}
num=(*str=='-'?(-temp):temp);
} int atoi(const char *s)
{
char *p = s;
char c;
int i = ;
while(c=*p++)
{
if(c>='' && c <='')
{
i = i* + (c-'');
}
else
return -; //Invalid string
}
return i;
}
********************************************************************************************
itoa 把一整数转换为字符串
例程序:
#include <ctype.h>
#include <stdio.h>
void itoa (int n,char s[]);
//atoi 函数:将s转换为整形数
int main(void )
{
int n;
char s[];
printf("Input n:\n");
scanf("%d",&n);
printf("the string : \n");
itoa (n,s);
return ;
}
void itoa (int n,char s[])
{
int i,j,sign;
if((sign=n)<)//记录符号
n=-n;//使n成为正数
i=;
do{
s[i++]=n%+'';//取下一个数字
}while ((n/=)>);//删除该数字
if(sign<)
s[i++]='-';
s[i]='\0';
for(j=i;j>=;j--)//生成的数字是逆序的,所以要逆序输出
printf("%c",s[j]); } java 怎样把字符串数组如 String array[]={"","","","",""};
转化成int型的 ?
String array[] = { "", "", "", "", "" };
int[] number = new int[array.length];
for (int i = ; i < array.length; i++) {
int num = Integer.parseInt(array[i]);// 转换
number[i] = num;
}
System.out.println(number.length); # include <stdio.h>
# include <stdlib.h> int main ()
{
int num_int;
double num_double;
char str_int[] = ""; //将要被转换为整型的字符串
char str_double[] = "436.55"; //将要被转换为浮点型的字符串 num_int = atoi(str_int); //转换为整型值
num_double = atof(str_double); //转换为浮点型值 printf("num_int: %d\n", num_int);
printf("num_double: %lf\n", num_double); return ;
} #include <iostream> using namespace std; int str2int(const char *str) { int temp = ; const char *ptr = str; //ptr保存str字符串开头8 9 if (*str == '-' || *str == '+') //如果第一个字符是正负号,10 { //则移到下一个字符11 str++;12 }13 while(*str != 0)14 {15 if ((*str < '0') || (*str > '9')) //如果当前字符不是数字16 { //则退出循环17 break;18 }19 temp = temp * 10 + (*str - '0'); //如果当前字符是数字则计算数值20 str++; //移到下一个字符21 } 22 if (*ptr == '-') //如果字符串是以"-"开头,则转换成其相反数23 {24 temp = -temp;25 }26 27 return temp;28 }29 30 int main()31 {32 int n = 0; 33 char p[10] = "";34 35 cin.getline(p, 20); //从终端获取一个字符串36 n = str2int(p); //把字符串转换成整型数37 38 cout << n << endl;39 40 return 0;41 }

字符转换(C、C++)的更多相关文章

  1. 【JavaScript】JS 中 原始字符串 和 HTML 字符转换

    参考资料:http://www.sjyhome.com/javascript/js-html-escape.html JS转换HTML转义符 SJY • 发表于:2013年10月05日 17:04 • ...

  2. 带毫秒的字符转换成时间(DateTime)格式的通用方法

    C#自身有更好的方式,Net任意String格式转换为DateTime类型 ====================================================== 原文 ==== ...

  3. sql字符转换函数大全

    删除空格 有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格.函数LTRIM()去除应该字符串前面的所有空格:函数RTRIM()去除一个字符串尾部的所有空格.这些和vbscript ...

  4. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理

    python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...

  5. js字符转换成整型 parseInt()函数规程Number()函数

    今天在做一个js加法的时候,忘记将字符转换成整型,导致将加号认为是连接符,  在运算前要先对字符井行类型转换,使用parseInt()函数   使用Number()将字符转换成int型效果更好

  6. mysql将字符转换成数字

    在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表 ...

  7. CString string char* char 之间的字符转换(多种方法)

    在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换.首先解释下三者的含义. CString 是一种很有用的数据类型.它们很大程度上简化了MF ...

  8. Linux c字符串中不可打印字符转换成16进制

    本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...

  9. vc++字符转换

    测试环境: vs2008 开发语言:C++ #include <iostream>#include <windows.h>#include <string> // ...

  10. [c/c++] programming之路(6)、ASCII码,数据类型、随机数、字符转换及拼接等

    一.变量 #include<stdio.h> #include<stdlib.h> void main0(){ //数据使用必须在范围内,否则产生溢出 unsigned +;/ ...

随机推荐

  1. struts2上传图片的全过程

    struts2上传图片的过程 1.写一个上传的jsp页面upload_image.jsp,内容如下:<body><center>    <font color=" ...

  2. Android组件安全

    今天在看有关Android组件安全的东西 1.Activity Android系统组件在指定Intent过滤器(intent-filter)后,默认是可以被外部程序(签名不同,用户ID不同)访问的,在 ...

  3. 一个简易的四则运算单元...(15.12.15 BUG更新)

    网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...

  4. css background-size 属性 兼容ie8 ie7 方案

    <!-- background-size-polyfill v0.2.0 | (c) 2012-2013 Louis-Rémi Babé | MIT License --> <PUB ...

  5. asp.net 重定向的三种方法

    1.Server.Transfer("URL"): 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到newPage.aspx, 并将转向前数据加上newPage.aspx ...

  6. 静态工厂方法VS构造器

    我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创 ...

  7. TweenMax学习一

    TweenMaxjs是一个性能很高的js动画框架,它与css3动画具有时间轴的概念.你可以很方便的把动画添加到一个时间轴队列里面去按照你需要的顺序去执行. 官网地址: http://greensock ...

  8. 动态SQL语句之sp_executesql的使用

    sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如: exec sp_executesql @sql, N'@item_name nvarchar(10 ...

  9. angularJs之service

    自定义服务: 方法一:controller中返回值,service中return <!DOCTYPE html> <html> <head> <meta ch ...

  10. 如何查看当前使用的Entity Framework版本

    Visual Studio 中-----工具-----NuGet套件管理员-----套件管理器控制台-----输入Get-Package即可查看当前使用的版本信息