手写字符串数字转数字代码
规定不能使用 c 中已经存在的atoi 等函数完成操作
算法思想
定义一个操作函数 mytoi(char *str),传递字符数组的首地址,循环条件是 *(str + i) != '\0' 没有遇见字符数组中的 '\0'时候,循环内部当 (*(str + i) >= '0') && (*(str + i) <= '9') 满足条件成立的时候,意味着遇见了数字,则执行 num = num * 10 + (*(str + i) - '0'); 其中 *(str + i) - '0' 是字符数字转 int 类型的数字,如 字符 '1'的ascill值是 1 ,那么 '1' - 1 就是为数字 1。依次循环执行操作 i++,实现对每一个字符数组中的每一个元素的操作转换
代码实现
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int mytoi(char *str)
{
int i = 0;
int num = 0;
//'\0'的 asclli 值是 0 所以也不符合下面的 条件就会退出程序
while (*(str + i) != '\0')
{
//*str - '0' 是转化为数字 '0'的阿斯科马值是 48 '9'的阿斯科马值是 57
if ((*(str + i) >= '0') && (*(str + i) <= '9'))
{
num = num * 10 + (*(str + i) - '0');
}
i++;
}
//两种方式都可以
// 当没有执行到最后一个字符串执行循环
// while (*str != '\0')
// {
// //*str - '0' 是转化为数字 '0'的阿斯科马值是 48 '9'的阿斯科马值是 57
// if (*str >= '0' && *str <= '9')
// {
// num = num * 10 + (*str - '0');
// }
// str++;
// }
return num;
}
void test2()
{
char str[] = "kmmmm1255jj";
printf("字符串是 %s \n", str);
printf("字符串中的数字是 %d \n", mytoi(str));
}
int main(int argc, char const *argv[])
{
test2();
return 0;
}
输出结果
算法总结
对于下面的while中的循环条件,这种写法有问题,不能识别以 26 个英文字符开头的字符数组,但是该字符数组中存在连续的数字,比如 char str[] = "kmmmm1255jj"; 这种情况下while 循环根本没有执行,所以即使 字符数组 中存在数字,也判断不了,返回值始终为 0 ,打印 结果也必然为 0