You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:57:25