一.进制转换的相关知识
二.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为例
负数这里注意十进制这的符号问题。
宝子们如果觉得这两个代码还有什么情况没有考虑到可以在下方评论。
本章未完,待续。。。。