下面我们看一组代码
#include <stdio.h>
#include <string.h>
void nidao(unsigned char* s)
{
int leng = strlen((char*)s); // 计算字符串‘s’的长度,并赋值给leng;
unsigned char re[2000]; //声明一个临时数组re 以存储反转后的字符串。假设输入字符的 最大长度为2000。
unsigned char* p1 = s; //p1
指向输入字符串的开头;
unsigned char* p2 = re + leng; //p2
最初指向 tmp
数组的末尾;
*p2-- = 0; //将空终止符赋给 tmp
数组的末尾,表示反转字符串的结束
while (*p1) //使用 while
循环遍历输入字符串的每个字符
{
if (*p1 < 0x80) { // ASCII字符,字符串小于127的
*p2-- = *p1++;
}
else {
*(p2 - 1) = *p1++;
*p2 = *p1++;
p2 -= 2;
}
}
for (int i = 0; i < leng; i++)
{
s[i] = re[i]; //将反转后的字符串从re数组复制回原始数组 (s
);
}
}
int main()
{
unsigned char str[] = "我是小萌新";
nidao(str);
printf("result: %s\n", str);
return 0;
}strlen
函数是C语言标准库中的一个函数,用于计算字符串的长度。
(char*)s
这部分是一个类型转换。它将 s
从无符号字符指针类型转换为字符指针类型。
当你逆转一个字符串时,如果直接在原始字符串上进行修改,可能会导致错误的结果,因为逆转过程涉及到交换字符的位置。为了避免这种问题,通常会创建一个临时数组,将逆转后的字符存储在其中,然后再将结果复制回原始数组。
这段代码中使用了两个指针 p1
和 p2
,分别指向原始字符串和临时数组的末尾。通过在循环中逐个字符处理,将字符逆转后存储在 re 数组中。最后,通过循环将 re中的字符复制回原始数组,实现字符串的逆转。