//第一次尝试:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int myAtoi(const char* str) {
char TS[1024] = { 0 };
char* ts = TS;
//设置符号位,用来判定这样的情况:不见可字符,数字,不可见字符,数字
//如果前面为不可见字符,在遇到数字后,flag1就++,这样就不会进入后面的不可见字符
int flag1 = 0;
//外部循环判定前面的 数字、正负号、不可见字符
while ((*str > 47 && *str < 58)||((*str==43||*str==45)&&flag1==0)||(*str>=0&&*str<=32&&flag1==0)) {
//内部循环判定出现数字之后的 不可见字符、正负号
if ((*str > 47 && *str < 58)||((*str == 43 || *str == 45))) {
*ts = *str;
ts++;
str++;
flag1++;
}
else {
str++;
}
}
*ts = '\0';
int i = 0;
//设置符号位,如果是‘-’,那么flag就加一
int flag = 0;
if (TS[i] == 45) {
i++;
flag++;
}
int ret = 0;
while (TS[i] != '\0') {
ret += (TS[i] - 48);
ret *= 10;
i++;
}
ret /= 10;
//将数字筛选出来转换成对应的整形之后,如果flag==1,那么就让数字减去自己的二倍,即可获得对应数字的负值
if (flag == 1) {
return ret - ret * 2;
}
//如果flag==0,那么正常输出转化好的数字
return ret;
}
int main() {
printf("输入一串字符串:\n");
char str[1024] = { 0 };
int i = 0;
char c = 0;
scanf("%c", &c);
while (c != '\n') {
str[i] = c;
scanf("%c", &c);
i++;
}
printf("%s\n", str);
int ret = myAtoi(str);
printf("%d\n", ret);
/*int a = atoi(" 123 123jklb");
printf("%d\n", a);*/
return 0;
}
//用法:将字符串里的数字字符转化为整形数。返回整形值。
//注意:转化时跳过前面的不可见字符,直到遇上数字或正负符号才开始做转换,
// 而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
//具体转化思路见上面代码的注释