C++关于字符串与整数之间运算问题(itoa,atoi)笔记

1.设计一个itoa函数,将整数n变成字符串数组存储并打印出来 


#include <iostream>
using namespace std;
 
void itoa(int n,char* res)
{
	int flag=1;
	int i=0,j=0;
	char buf[100]="";
	if(n<0)
		res[i++]='-';//如果是负数,第一位就是‘-’,不是的话这句话不执行
	n=abs(n);
	while(n)
	{
		buf[j++]=n%10+'0';
		n=n/10;
	}
	j--;
	while(j>=0)
		res[i++]=buf[j--];//倒序赋值给res
}
 
int main()
{
	int num;
	char res[10]="";
	cin>>num;
	itoa(num,res);
	cout<<res<<endl;
	return 0;
}

需要注意的是在定义字符串数组时我们要将其初始化

如char  res[10]="";

不置空的话res[10]中存储的是一堆垃圾字符,其内存空间也未知,这样我们在转化完成输出res时会得到乱码

同样的函数中buf也得初始化

另外的,我们也可以用char*型存储

但我们必须给该指针分配内存空间

char* res=new char[100];

不分配的后果会比字符串数组更为严重,你甚至无法得到结果

此外当然可以使用Windows自带的转换函数,sprintf将数字转换为字符串

 

这个不是C标准库中的函数,而是Windows平台下扩展的,标准库中有sprintf,功能比这个更强,用法跟printf类似:

char str[255];

sprintf(str, "%x", 100); //将100转为16进制表示的字符串。

 

2. atoi 实现字符串转int型

#include<iostream>
#include<string>
#include<math.h>
const int N=100;
const int NU=0;
const int FALSE=-1;
using namespace std;
int atoi(const char* a){
	int i,k,s=0;
	if(strlen(a)==0) 
	return  NU;
	if((a[0]!='-'&&a[0]!='0')||strlen(a)==1)//十进制 
	{     for(i=0;i<strlen(a);i++)
	    {     k=a[i]-'0';
	          s+=k*pow(10,strlen(a)-i-1);
	    	
	    	
	    	
	    	
	    }
	    return s;
	}
	else if(a[0]!='-'&&a[0]=='0'&&a[1]!='x')//八进制 
	    {    for(i=0;i<strlen(a);i++)
		    {  k=a[i]-'0';
		       s+=k*pow(8,strlen(a)-i-1);
		       
		    	
		    	
		    	
		    	
		    	
		    } 
	    	
	    	return s;
	    	
	    }
	  else  if(a[0]!='-'&&a[0]=='0'&&a[1]=='x')
	   {     for(i=strlen(a)-1;a[i]!='x';i--)
	         {     if(a[i]>='A')
	              {k=a[i]-'A'+10;
	              }
	              else k=a[i]-'0';
	              s+=k*pow(16,strlen(a)-i-1);
	         
	         
	         
	         }
	   	
	   	
	   	return  s;
	   	
	   }
	   else if(a[0]=='-'&&a[1]!='0')
	   {     for(i=1;i<strlen(a);i++)
	    {     k=a[i]-'0';
	          s+=k*pow(10,strlen(a)-i-1);
	    	
	    	
	    	
	    	
	    }
	    return -s;
	   }
	   else if(a[0]=='-'&&a[1]=='0'&&a[2]!='x'){
	   	 for(i=2;i<strlen(a);i++)
		    {  k=a[i]-'0';
		       s+=k*pow(8,strlen(a)-i-1);
		       
		    	
		    	
		    	
		    	
		    	
		    } 
	    	
	    	return -s;
	    	
	   	
	   	
	   	
	   	
	   	
	   }
	else if(a[0]=='-'&&a[1]=='0'&&a[2]=='x'){
		
		
		for(i=strlen(a)-1;a[i]!='x';i--)
	         {     if(a[i]>='A')
	              {k=a[i]-'A'+10;
	              }
	              else k=a[i]-'0';
	              s+=k*pow(16,strlen(a)-i-1);
	         
	         
	         
	         }
	         return -s;
		
		
	}
	else  return FALSE;
	
	
}
int main()
{char str1[N],str2[N],str3[N];
int t;
cin>>str1;
t=atoi(str1);
cout<<t<<endl;
cin>>str2;
t=atoi(str2);
cout<<t<<endl;
cin>>str3;
t=atoi(str3);
cout<<t<<endl;
	
	
	
	
	
}

c和c++中8进制默认以0开头,16进制默认以0x(x不区分大小写)开头

atoi函数实现对10 8 16进制形式数字字符串的int型转换 

char* 和char []在用法上有很多相似   在一般情况下

void test(int n,char str[]和(int n,char* str)

都可以完成对实参的修改操作

但在默认情况下char* a=“hello world”,是不允许修改的,char a[]则无此限制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值