C语言指针实战:倒序字符串与数字千分位格式化
通过实际代码案例,详细讲解C语言指针如何用于字符串倒序排列,并解决大数按三位加逗号的分隔符插入问题。
一、利用指针实现字符串倒序
在使用指针操作字符数组时,最常用的场景之一是反转字符串。其核心逻辑是利用两个分别指向首部和尾部的指针,相向而行并进行内容交换。
以下是实现该功能的C语言代码:
void _reversal(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
在上述实现中:left 和 right 分别作为首尾指针。left++ 使左指针按字节(char类型)向后移动至下一个元素的地址,right-- 则向前移动。这种双指针法不仅能高效完成逆序,也直观展示了C语言指针基于内存地址偏移的原理。
二、实战:大数每三位加逗号
在处理较大的整数(例如 980364535)时,为了便于朗读和阅读,通常需要将其格式化为每三位数字用逗号分隔的形式(如 980,364,535)。虽然可以先转为字符串处理,但利用指针的移动可以清晰地体现算法逻辑。
题目要求
- 输入:一行包含一个整数 N(1 ≤ N ≤ 2,000,000,000)。
- 输出:添加了千分位分隔符后的字符串。
解题思路
直接正序插入逗号较为繁琐,因为从个位开始每三位就需要加一个符号。更巧妙的做法是:
- 第一次倒序:将读取到的字符串原地反转,这样原本位于末尾的数字变成了最前面的位置。
- 拼接逗号:使用新指针每次取三个字符,并在其后追加一个逗号,写入新的缓冲区。
- 第二次倒序:再次将拼接好的长串字符串反转回来,恢复正确的从左到右的顺序。
- 移除头尾标点:检查生成的字符串开头是否为逗号,若是则跳过该字符输出。
完整代码示例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
// 复用之前的倒序函数
void _reversal(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr1[2000] = { 0 };
// 安全地读取用户输入
gets_s(arr1);
int len = strlen(arr1);
// 第一步:翻转原始字符串
_reversal(arr1, arr1 + len - 1);
char arr2[2000] = { 0 };
char* pr1 = arr1; // 遍历原串的指针
char* pr2 = arr2; // 写入带逗号串的指针
int i = 0;
// 第二步:每三个字符后插入逗号
// 循环次数足以覆盖整段字符串并容纳新增的标点
while (i <= len / 3 + 1)
{
pr2[0] = pr1[0];
pr2[1] = pr1[1];
pr2[2] = pr1[2];
pr2[3] = ',';
pr1 += 3; // 指针跳过这三个字符
pr2 += 4; // 指针前进四位(含刚写入的逗号)
i++;
}
int len1 = strlen(arr2);
// 第三步:将整个新生成的串再翻转一次
_reversal(arr2, arr2 + len1 - 1);
// 第四步:处理可能的头部多余逗号
if (arr2[0] == ',')
{
// 如果第一个字符是逗号,直接从第二个字符开始打印
printf("%s", arr2 + 1);
}
else
{
// 否则正常打印
printf("%s", arr2);
}
return 0;
}
三、总结
通过这道题可以看出,C语言的指针不仅可以指向变量,还能像游标一样对内存块进行步进式(+=3)读写。倒序字符串不仅是理解指针运算的基础,在处理这类需要“逆向思维”或“分段重组”的问题时,往往能起到化繁为简的作用。熟练掌握 *ptr 访问、ptr++ 移位以及多步倒序的组合技巧,是深入理解C语言底层数据操作的必经之路。
以上就是C语言指针倒序字符串与千分位格式化处理的详细内容,更多关于C语言指针进阶应用资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









