C语言基于指针实现字符串指定字符替换的问题求解
C语言字符替换功能实现说明
结论:你完全可以在现有遍历字符串的for循环中直接完成字符替换,不需要额外新增遍历流程,一次遍历即可完成匹配+替换操作。
你当前已经实现了遍历字符串匹配目标字符的逻辑,只需要在匹配成功的分支里增加赋值替换的操作即可。另外题目要求基于指针实现,你可以直接用字符指针遍历字符串完成操作,不需要依赖数组下标。
现有代码的修改点说明
- 你的
scanf格式串里建议把%s改成%99s,限制输入字符串的最大长度为99,给字符串结束符\0留位置,避免输入过长导致数组越界。 - 遍历到匹配
start的字符时,直接把当前位置的字符赋值为end即可,因为是单字符替换,字符串长度不会变化,不需要额外申请新的内存空间存储结果,原地修改原数组就行。
两种实现方式
方式1:基于你现有下标遍历的改法
直接修改你原来的for循环逻辑:
for (int i = 0; pointer.message[i] != '\0'; ++i) { if (pointer.start == pointer.message[i]) { // 匹配到待替换字符,直接替换为目标字符 pointer.message[i] = pointer.end; } } // 循环结束后pointer.message就是替换完成的字符串 printf("new message = %s\n", pointer.message);
方式2:基于指针的标准实现(符合题目要求)
定义字符指针指向字符串首地址,通过指针移动完成遍历,不需要用数组下标:
// 指针指向message字符串的第一个字符 char *p = pointer.message; // 解引用指针获取当前字符,遇到字符串结束符\0时终止遍历 while (*p != '\0') { if (*p == pointer.start) { // 匹配成功时,直接修改指针指向的内存空间的字符值 *p = pointer.end; } p++; // 指针向后移动1位(char类型占1字节,移动后指向下一个字符) } printf("new message = %s\n", pointer.message);
完整可运行代码
头文件(replace.h)
typedef struct pointer{ char message[100]; char start; char end; } tPointer; tPointer readMsg();
功能实现文件(replace.c)
#include <stdio.h> #include "replace.h" tPointer readMsg(){ tPointer nPointer; printf("Input word, char start and char end (between spaces): "); scanf("%99s %c %c", nPointer.message, &nPointer.start, &nPointer.end); return nPointer; }
主函数文件(main.c)
#include <stdio.h> #include "replace.h" int main(){ tPointer pointer; pointer = readMsg(); printf("origin content: %s, replace rule: %c -> %c\n", pointer.message, pointer.start, pointer.end); // 执行指针方式替换 char *p = pointer.message; while (*p != '\0') { if (*p == pointer.start) { *p = pointer.end; } p++; } printf("new message = %s\n", pointer.message); return 0; }
运行效果验证
- 输入
stack a b,输出new message = stbck,完全匹配示例1 - 输入
overflow o z,输出new message = zverflzw,完全匹配示例2
补充说明:如果输入时字符参数位置输入了多个字符,
scanf默认会取第一个字符作为start和end的值,如果需要做输入合法性校验,可以在读取输入后增加判断逻辑。
内容的提问来源于stack exchange,提问作者ddddddd
相关产品推荐
相关产品推荐

