字符串数字转数字(面试题)

12 篇文章 0 订阅
文章介绍了一种在C语言中不使用现成的atoi函数,而是自定义函数mytoi将包含数字的字符数组转换为整数的方法。通过遍历字符串,检查每个字符是否为0-9之间的ASCII值,并将其转换为对应的数字,累加到结果中。然而,现有代码存在一个问题,即无法处理以非数字字符开头的字符串,导致在含有数字但非数字开头的字符串中,转换会失败。
摘要由CSDN通过智能技术生成

手写字符串数字转数字代码

规定不能使用 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值