字符串逆置
方法1:下标法,定义一个i下标从头开始,使用strlen函数求出字符串长度(不包括'\0'),定义一个j下标等于字符串长度减一,i,j下标字符进行交换,只需要遍历字符串长度一半即可
方法2:额外创建一个数组,求出原字符串长度,定义下标j为字符串长度减一,从尾巴开始遍历将字符复制到新数组,最后结尾记得加'\0'
方法3:我们可以让一个指针(类似于下标的用法,代表字符的地址),从头走到尾,然后进行字符交换

如上图当str和p同时指向c时停止,那么交换结束,但如果字符串长度为偶数,且当str大于p时交换结束,即循环结束条件为str>p(指针可以比较大小)
代码实现:
void Reverse(char* str)
{char* p;for (p = str; *p != '\0'; p++){;}//*p已经是'\0'p--; //所以要减1char temp;while (str < p){temp = *p;*p = *str;*str = temp;str++;p--;}
}int main()
{char arr[100];scanf("%s", arr);Reverse(arr);printf("%s",arr);return 0;
}
测试用例:

首先我在这里讲一下10进制数转换其他进制数字的思想
给你一个十进制,比如72;首先72%16 得到余数 8; 72/16 得到商为4; 4%16 得到余数 4 ; 4/16 等于0. 当商为零的时候,将获得的余数倒序输出即可得到,72相对应的十六进制为 48.
如果掌握了上面的字符串逆置和进制转换的方法,那么我们来思考一下下面这道题:
把数字n转成radix进制的字符串,存放在str中,例如123456,10->"123456"
123,16->"7B". radix在[2,36]范围
我们应该怎么做呢? 首先我们需要思考如何将一个数字转为字符eg:123->"123"
观察上图ASCII表可知数字1与字符1相差48,数字2与字符2相差48,而48正是字符'0'的ASCII值,那么数字1变为字符1是不是就是'1'=1+'0',但是这只适用于0-9的数字,如果我们对数字进行进制取余大于9该如何转换呢?

观察上图我们可知,假设为16进制,我们对数字10进行16取余数得到10如何转为'A'呢?即'A'=10-10+'A' 同理数字11转为16进制字符为'B'=11-10+'A'
这样我们就将0-9,和大于9的数字转换为字符的问题解决了,全部转为字符串后记得后面补'\0',调用前面的字符串反序函数即可!
代码示例:
void Reverse(char* str) //字符串反序
{char* p;for (p = str; *p != '\0'; p++){;}//*p已经是'\0'p--; //所以要减1char temp;while (str < p){temp = *p;*p = *str;*str = temp;str++;p--;}
}
void Myitoar(char* str, int n, int radix) //进制转换
{int i = 0;int temp;do{temp = n % radix;if (temp < 10){*(str + i) = temp + '0';i++;}else{*(str + i) = temp - 10 + 'A';i++;}n /= radix;} while (n != 0);*(str + i) = '\0';Reverse(str);
}
int main()
{char arr[100];int n;char* p = arr;printf("请输入数字:");scanf("%d", &n);int rax;printf("请输入所要转换的进制:");scanf("%d", &rax);Myitoar(p, n, rax);/*for (; *p != '\0'; p++){printf("%c",*p);}*/printf("转换后为:");printf("%s", p);return 0;
}
测试用例:






















