- 论坛徽章:
- 0
|
5可用积分
书上有道练习题要求将C标准库函数中的atoi()的功能用C语言实现并在某个主叫函数中加以验证。我自己写了一个myatoi(),可以实现atoi()的功能但还是有些问题,请各位加以指正。谢谢!
/*Use the character classification functions to prepare an
implementation of atoi().*/
#include <stdio.h.>
#include <math.h>
#define N 10
int myatoi(const char *);
int isdigit(const char); //判断某个字符是否是数字的函数
int mypow(int,int); //我自己写的幂函数,以正整数为底和指数
int main(void){
char getstr[N];
while(gets(getstr))
printf("\nValue: %d\n",myatoi(getstr));
getch();
return 0;
}
int myatoi(const char *ar){
int val = 0,i = 0,cnt = 0;
int flag,j;
int itar[N];
char recneg;
while(*ar){
if(*ar == '-'){
if(isdigit(*(ar+1)) && !isdigit(*(ar-1)))
//当负号前面不是数字而后面是数字时
recneg = '-';
else if(isdigit(*(ar+1)) && isdigit(*(ar-1))){
//当负号前后都是数字时
flag = 1;
break;
}
}
if(isspace(*ar) && isdigit(*(ar+1))
&& isdigit(*(ar-1))){
flag = 1;
break;
}
if(!isdigit(*ar) && *ar != '-' && !isspace(*ar)){
//当字符为数字、空格、负号以外的字符时
if(isdigit(*(ar-1))){
//当该字符前面是数字时
flag = 1;
break;
}
else{
flag = 0;
break;
}
}
if(isdigit(*ar)){
itar = *ar - 48; //将字符数字转化为相应的整型数字并存入数组
cnt++;
i++;
}
ar++;
}
for(i = 0,j = cnt-1; i < cnt, j >= 0; i++,j--){
//这个循环将数组元素逐个乘以相应次数的权然后将所得的积相加得到需要的整数
val += itar * mypow(10,j);
}
if(flag == 0)
return flag;
else{
if(recneg == '-')
return -val;
else
return val;
}
}
int isdigit(char ch){
if(ch > '9' || ch < '0')
return 0;
else
return 1;
}
int mypow(int x, int y){
int i;
int z = 1;
for(i = 0; i < y; i++)
z *= x;
return z;
} |
|