鱼C论坛

 找回密码
 立即注册
查看: 1165|回复: 2

[已解决]字符串替换

[复制链接]
发表于 2023-12-13 20:34:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖粥ttt 于 2023-12-13 20:54 编辑

C语言使用指针操作,完成字符串替换怎么写呢?
如把 hello world 中的hello 替换为nihao
最佳答案
2023-12-13 20:44:10
在C语言中,可以使用指针来编写一个字符串替换函数。以下是一个可能的实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* str_replace(char *target, const char *needle, const char *replacement) {
    char buffer[1024] = { 0 };
    char *insert_point = &buffer[0];
    const char *tmp = target;
    size_t needle_len = strlen(needle);
    size_t repl_len = strlen(replacement);

    while (1) {
        const char *p = strstr(tmp, needle);

        // 如果没有找到需要替换的字符串,就复制剩下的字符串
        if (p == NULL) {
            strcpy(insert_point, tmp);
            break;
        }

        memcpy(insert_point, tmp, p - tmp);
        insert_point += p - tmp;

        memcpy(insert_point, replacement, repl_len);
        insert_point += repl_len;

        tmp = p + needle_len;
    }

    // 结果字符串需要重新分配内存
    char *res = malloc(strlen(buffer) + 1);
    strcpy(res, buffer);

    return res;
}

int main() {
    char str[] = "Hello World";
    char *result = str_replace(str, "Hello", "Nihao");
    printf("%s\n", result);
    free(result);
    return 0;
}

这个例子中的`str_replace`函数通过查找目标字符串`needle`在原始字符串`target`中的位置,然后用`replacement`替换它,通过在新的字符缓冲区`buffer`中构造新的字符串来完成替换。然后它返回一个新分配的字符串,该字符串包含替换后的结果。注意这个函数使用了若干标准库的函数,如`strstr`, `strcpy`, `memcpy`,以处理指针和字符串。

这段程序执行后,会将"Hello World"替换为"Nihao World",并将其输出。

需要注意的是,这个实现简单且有点粗糙,并且不处理输入中的特例(例如,输入字符串太长不能存入buffer,或者malloc无法分配内存等)。在实际使用中,你可能需要更健壮的实现,这可能涉及输入验证和错误处理,以及可能的内存管理优化。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-13 20:34:32 | 显示全部楼层
要使用指针操作完成字符串替换,可以通过遍历字符串,并使用条件语句来判断并替换指定的字符。下面是一个示例代码,将一个字符串中的所有字符"a"替换为"b":
#include <stdio.h>void replaceString(char *str, char find, char replace) {    while (*str != '\0') {        if (*str == find) {            *str = replace;        }        str++;    }}int main() {    char str[] = "Hello, world!";    char find = 'o';    char replace = 'x';    replaceString(str, find, replace);    printf("%s\n", str);    return 0;}
在上面的代码中,`replaceString`函数接受指向字符串的指针 `str`,要查找的字符 `find`,以及要替换成的字符 `replace`。通过遍历字符串,当发现字符和要查找的字符相等时,就使用指针操作将其替换为指定的字符。

在主函数中,我们定义了一个字符串 `str`,并调用 `replaceString` 函数进行替换,然后打印替换后的字符串。

注意,在使用指针操作时,要确保字符串是可修改的,即在定义字符串时使用字符数组而不是常量字符串。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

发表于 2023-12-13 20:44:10 | 显示全部楼层    本楼为最佳答案   
在C语言中,可以使用指针来编写一个字符串替换函数。以下是一个可能的实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* str_replace(char *target, const char *needle, const char *replacement) {
    char buffer[1024] = { 0 };
    char *insert_point = &buffer[0];
    const char *tmp = target;
    size_t needle_len = strlen(needle);
    size_t repl_len = strlen(replacement);

    while (1) {
        const char *p = strstr(tmp, needle);

        // 如果没有找到需要替换的字符串,就复制剩下的字符串
        if (p == NULL) {
            strcpy(insert_point, tmp);
            break;
        }

        memcpy(insert_point, tmp, p - tmp);
        insert_point += p - tmp;

        memcpy(insert_point, replacement, repl_len);
        insert_point += repl_len;

        tmp = p + needle_len;
    }

    // 结果字符串需要重新分配内存
    char *res = malloc(strlen(buffer) + 1);
    strcpy(res, buffer);

    return res;
}

int main() {
    char str[] = "Hello World";
    char *result = str_replace(str, "Hello", "Nihao");
    printf("%s\n", result);
    free(result);
    return 0;
}

这个例子中的`str_replace`函数通过查找目标字符串`needle`在原始字符串`target`中的位置,然后用`replacement`替换它,通过在新的字符缓冲区`buffer`中构造新的字符串来完成替换。然后它返回一个新分配的字符串,该字符串包含替换后的结果。注意这个函数使用了若干标准库的函数,如`strstr`, `strcpy`, `memcpy`,以处理指针和字符串。

这段程序执行后,会将"Hello World"替换为"Nihao World",并将其输出。

需要注意的是,这个实现简单且有点粗糙,并且不处理输入中的特例(例如,输入字符串太长不能存入buffer,或者malloc无法分配内存等)。在实际使用中,你可能需要更健壮的实现,这可能涉及输入验证和错误处理,以及可能的内存管理优化。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表