字符串转换成整数思路(atoi):如有空白符,则跳过;如有符号,则记录符号并跳过;取整数部分并执行转换(循环累加)
int myatoi(char str[])
{
int sign,n,i;
for(i=0;isspace(str[i]);i++) //跳过空白符
;
sign=(str[i]=='-')?-1:1; //检查符号
if(str[i]=='+'||str[i]=='-') //跳过符号
i++;
for(n=0;isdigit(str[i]);i++) //计数
n=10*n+(str[i]-'0'); //这里的'0'可以用0x30代替
return n*sign;
}
整数转换成字符串的思路:记录符号,以反序生成数字(先取数再判断下一位数)并存储在字符串数组中,添加符号(末位)之后逆序输出结果
char *myitoa(int n,char str[])
{
int i;int sign;
if((sign=n)<0) //记录符号
n=-n; //转化成正数
i=0;
do
{ //反序生成数字
str[i++]=n%10+'0'; //取下一个数字
}while((n/=10)>0); //先执行语句后执行判断,这里如果使用先判断再执行则会出错噢!
if(sign<0)
str[i++]='-';
str[i]='\0';
assert(str!=NULL); //判空
char *s1=str;
char *s2=str+strlen(str)-1;
for(;s1<s2;s1++,s2--) //逆序
{
char temp=*s1;
*s1=*s2;
*s2=temp;
}
return str; //返回结果
}
完整代码如下:
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
int myatoi(char str[])
{
int sign,n,i;
for(i=0;isspace(str[i]);i++) //跳过空白符
;
sign=(str[i]=='-')?-1:1; //检查符号
if(str[i]=='+'||str[i]=='-') //跳过符号
i++;
for(n=0;isdigit(str[i]);i++) //计数
n=10*n+(str[i]-'0'); //这里的'0'可以用0x30代替
return n*sign;
}
char *myitoa(int n,char str[])
{
int i;int sign;
if((sign=n)<0) //记录符号
n=-n; //转化成正数
i=0;
do
{ //反序生成数字
str[i++]=n%10+'0'; //取下一个数字
}while((n/=10)>0); //先执行语句后执行判断,这里如果使用先判断再执行则会出错噢!
if(sign<0)
str[i++]='-';
str[i]='\0';
assert(str!=NULL); //判空
char *s1=str;
char *s2=str+strlen(str)-1;
for(;s1<s2;s1++,s2--) //逆序
{
char temp=*s1;
*s1=*s2;
*s2=temp;
}
return str; //返回结果
}
int main()
{
char str1[]="-123";
int myi=myatoi(str1);
printf("测试将字符串变成整数:%d\n",myi);
char *str2=new char[20];
printf("测试将整数变成字符串:%s\n",myitoa(-34567,str2));
system("pause");
return 0;
}