如何在C语言中用指针反转字符串(禁用数组表示与字符串库函数)
用指针反转C字符串(无数组表示法/字符串库函数)
我来帮你搞定这个问题,完全符合你要求的不使用数组表示法、不调用字符串库函数的规则。先给你补全并优化后的完整可运行代码,再一步步拆解关键细节:
#include <stdio.h> #include <stdlib.h> // 提前声明函数,避免编译时隐式声明报错 void reverse2(char *string, char *string2); int main(void) { char *forward = "123"; // 分配足够内存存储反转后的字符串(3个字符+1个终止符,共4字节) char *back = malloc(sizeof(char) * 4); if (back == NULL) { // 必须检查内存分配是否成功,避免崩溃 fprintf(stderr, "内存分配失败!\n"); return 1; } reverse2(forward, back); printf("原字符串:%s\n反转后:%s\n", forward, back); free(back); // 用完动态分配的内存记得释放,避免泄漏 return 0; } void reverse2(char *string, char *string2) { char *string1 = string; // 第一步:移动指针到字符串末尾(找到'\0'的位置) while (*string1) { string1++; } string1--; // 现在string1指向原字符串的最后一个有效字符(比如"123"里的'3') char *dest = string2; // 用dest跟踪目标字符串的当前写入位置 // 第二步:从后往前逐个复制字符 while (string1 >= string) { *dest = *string1; dest++; string1--; } *dest = '\0'; // 关键!C字符串必须以'\0'结尾,否则会出现乱码 }
关键细节说明
- 函数声明:在
main之前声明reverse2,否则编译器会因为找不到函数定义而报错。 - 内存安全:永远要检查
malloc的返回值,如果内存分配失败,直接终止程序避免后续非法操作。 - 纯指针操作:
- 通过
while (*string1)判断是否到达字符串末尾(因为C字符串以'\0'结尾,此时*string1的值为0,循环终止)。 - 用
string1 >= string作为循环条件,直接通过指针位置判断是否复制完所有字符,完全不需要额外的计数器变量。
- 通过
- 字符串终止符:最后一定要给目标字符串加上
'\0',否则printf会读取内存中的垃圾数据,导致输出乱码。 - 内存释放:动态分配的内存使用完毕后必须用
free释放,避免内存泄漏。
如果你想保留你原来的计数器思路,也可以这样实现reverse2:
void reverse2(char *string, char *string2) { int counter = 0; char *string1 = string; // 计算字符串长度 while (*string1) { counter++; string1++; } string1--; // 指向最后一个有效字符 char *dest = string2; // 按计数器循环复制 for (int i = 0; i < counter; i++) { *dest = *string1; dest++; string1--; } *dest = '\0'; }
两种写法都完全符合你的要求,选你觉得更易读的就行。
内容的提问来源于stack exchange,提问作者Walker
相关产品推荐
相关产品推荐

