题目一:编程实现 atoi函数 (要求能够 识别 超出整数范围的 字符所转换的整数)
这个比较简单 采用字符指针遍历实现 注意:字符转换成对应数字要减 ‘0’, 数字转换成 相应字符 加上‘0’
//编程实现atoi 函数
#include<stdio.h>
#include<stdlib.h>
#define INT_MAX 21474883647
#define INT_MIN -2147483648
int myatoi(const char *string)
{
int val,flag;
unsigned int cutlim,cutoff;
if(string==NULL) return 0;
while(*string == ' '||*string == '\t')
string ++;
if(*string =='-'){
flag = 1;
string++;
}
else{
flag = 0;
if(*string == '+')
string ++;
}
cutoff = flag ?(unsigned int) INT_MAX+1 : INT_MAX;
cutlim = cutoff % 10;
cutoff /= 10; //用来判断是否会超出整数范围的指标
for(val = 0;isdigit(*string);string++){
if(val >cutoff ||(val==cutoff && (*string - '0')>cutlim)) //满足这个条件 表示转换的数会超出整数范围i 返回相应的上界或者下界
return flag ? INT_MIN : INT_MAX;
val = val*10 + (*string - '0');
}
if(flag)
return val*(-1);
else
return val;
}
int main()
{
char str[100];
int num;
while(scanf("%s",str)!=EOF){
num = myatoi(str);
printf("%d\n",num);
}
return 0;
}
题目二:编程实现 atof函数 (要求能够 识别 含有科学计数法的字符串所表示的整数
atof 函数的复杂之处在于 要对字符串中出现的小数点后面的字符 和 科学计数标志e E后面的字符进行 特殊处理
对于小数点后面的数 要计算出其位数 n 然后让最后算的值除10^n 科学计数法后面的数要单独算出其值 m 然后乘 或者 除 10^m
//对atof函数进行扩充,使其可以处理科学计数法形式的字符如 123.45e-6
#include<stdio.h>
#include<ctype.h>
double myatof(char *string)
{
double val,power;
int flag,exp,i;
if(string == NULL) return 0;
for(; isspace(*string);string++)
;
flag = (*string == '-') ? -1 : 1;
if(*string == '-' || *string =='+')
string++;
for(val = 0.0;isdigit(*string);string++){
val = val*10.0 + (*string - '0');
}
if(*string == '.') //对小数点后面部分数的处理
string++;
for(power = 1.0;isdigit(*string);string++){
val = val*10.0 + (*string - '0');
power *= 10.0;
}
val = (flag * val) / power;
if(*string == 'e'|| *string == 'E'){ //对含有科学计数法的 字符的处理
flag = (*++string == '-') ? -1 : 1;
if (*string =='+' ||*string == '-')
string++;
for(exp = 0;isdigit(*string);string++)
exp = exp*10 + (*string - '0');
if(flag == -1){
while(exp-- >0)
val /= 10.0;
}
if(flag == 1){
while(exp-- >0)
val *= 10.0;
}
}
return val;
}
int main()
{
char str[100];
double num;
while(scanf("%s",str)!=EOF){
num = myatof(str);
printf("%f\n",num);
}
return 0;
)