my_atoi&&my_itoa函数实现

一.进制转换的相关知识

二.my_atoi函数代码实现

三.代码解释

四.my_itoa函数代码实现

五.代码解释

一.进制转换的相关知识

正数的转换(10进制,2进制,8进制,16进制) 以123为例

                          

                                   

正数的原码==反码==补码

负数的原码!=反码!=补码         负数的反码==原码取反         负数的补码==原码取反+1

以-8为例     (最高位代表正负)

整数分为:有符号整数和无符号整数

我们发现无符号整数的原码==有符号整数的补码(负数),正数的话有无符号对他是没有影响的。

对248进行讨论

 如果要对负数进行进制准换我们可以考虑把它转换成无符号整数

插一句:atoi函数是字符串转化为数字

               itoa函数是数字转换成字符串

 二.my_atoi函数

#include <stdio.h>
#include<ctype.h>
int my_atoi(char* str) {
	int num = 0, result = 0, tap = 1;
	while (*str != '\0') {
		if (*str == ' ') {
			*str++;
		}
		if (*str == '-') {
			tap = -tap;
			*str++;
		}
		if (isdigit(*str)) {
			num = *str - '0';

			result = result * 10 + num * tap;
			*str++;
		}
		if (isalpha(*str)) {
			*str++;
		}
	}
	return result;
}
int main()
{
	char str[] = "   --- asduahsd123dajha  ---";
	int a = my_atoi(str);
	printf("%d", a);
}

 三.代码分析

case1:只有数字且为正数

 

 case2:只有数字但是有符号且符号不唯一

 case3:不仅有数字还有空格

 

 case 4:有数字,有空格,有英文字符

 

 这里我们分辨是数字字符还是英文字符还是空格字符我们使用到了一个头文件:#include<ctype.h>

通过这个库文件使用他的函数进而调出符号位和数字;

有兴趣的宝子还可以修改上面的my_atoi函数,使用这个函数还是很方便的

四.my_itoa函数代码

#include<stdio.h>
#include<ctype.h>
#include<string.h>
char* my_itoa(int val, int n, char arr[]) {
    int i = 0,flag = 0;
    if (val<0&&n==10) {
        val = -val;
        flag = 1;
    }
    unsigned int a = (unsigned int)val;
        switch (n) {
        case 16:
            while(a!=0){
            if (a%n>10) {
                    arr[i++] = a % n - 10 + 'A';
            }
            else {
                arr[i++] = a % n + '0';
                }
            a = a / n;
            }
                break;
        case 10 :
            while (a != 0) {
                arr[i++] = a % n + '0';
                a = a / n;

            }
            if (flag)
                arr[i] = '-';
            break;
        case  8:
        case  2:
            while (a != 0) {
                arr[i++] = a % n + '0';
                a = a / n;

            }
                break;
    }
    int sz = strlen(arr);
    char c;
    for (int j = sz - 1, i = 0; i <= j; i++, j--) {
        c = arr[j];
        arr[j] = arr[i];
        arr[i] = c;
    }
    return arr;
}
int main() {
    int num = -8;
    char arr[100] = "0";
    int n = 0;
    printf("输入转化的进制(10 or 2 or 8 or 16)\n");
    scanf_s("%d", &n);
    printf("%s\n", my_itoa(num, n, arr));
}

 五.my_itoa函数分析

case1:正数的进制转化(原理可以参考我们最开始讲到的进制转换)(以8为例)

 补充一点:16进制比较特殊,因为大于10的数字要用大写A-F表示

所以我们分开讨论,当大于10时得到的数字-10得到一个可以对‘A’进行改变的(就是ASCII码)‘A’+1->‘B’

 case 2:负数    以-8为例

 负数这里注意十进制这的符号问题。

宝子们如果觉得这两个代码还有什么情况没有考虑到可以在下方评论。

本章未完,待续。。。。

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值