gpt4 book ai didi

c - C 中的字符串搜索和替换程序实现

转载 作者:行者123 更新时间:2023-11-30 19:08:11 25 4
gpt4 key购买 nike

我正在编写一个 C 程序来查找字符串并将其替换为所需的字符串。假设我的源字符串是 Welcome bob。 bob 你好吗?,我的程序将用 job 替换 bob 的每个实例。这里模式字符串是 bob ,替换字符串是 job

我使用 Code::Blocks 作为我的 IDE。每当我给程序提供像 bit bit bi b 这样的源字符串时,我的程序都会将 bit 的所有实例替换为所需的字符串,例如 mit,但是在输出字符串的最后添加一些奇怪的字符。对于 bit bit bi b 源字符串,我的最终字符串是 mit mit bi bX▒

可以看到,字符串的最后添加了一些奇怪的字符。仅当源字符串的最后一个字符串是模式字符串的子字符串时,才会发生这种情况。在其他情况下,例如当源字符串是 welcome bob job 时,当源字符串的最后一个字符串不是模式字符串的子字符串时,程序可以正常工作。

为什么会发生这种情况?

#include <stdio.h>
#include <string.h>

main() {
int i = 0, j = 0, t = 0, k = 0, m = 0;
char s[50], p[50], r[50], f[50];
gets(s); //source string
gets(p); //pattern string
gets(r); //replace string
while (s[i] != '\0') {
if (s[m++] == p[j++]) {
if (p[j] == '\0') {
for (k = 0; r[k] != '\0'; k++, t++)
f[t] = r[k];
i = i + strlen(p);
j = 0;
}
} else {
f[t++] = s[i++];
j = 0;
m = i;
}
}
puts(f);
}

我只是想知道为什么输出中有不需要的或奇怪的字符。

最佳答案

在输出末尾出现虚假字符的原因是您没有在 f 数组末尾设置空终止符。在 puts(f); 之前插入 f[t] = '\0';

您的代码还有其他问题:

  • 不带参数的 main 签名为 int main(void)
  • 您不应使用 gets(),此函数不安全,已从最新版本的 C 标准中删除。使用 scanf()fgets() 并删除尾随换行符。
  • 您不会检查输出是否超出 f 数组的大小,如果替换字符串比模式字符串长,就会发生这种情况。

这是更正后的版本:

#include <stdio.h>
#include <string.h>

int main(void) {
int i, j, m;
char s[100], p[100], r[100];

if (fgets(s, sizeof s, stdin) // source string
&& fgets(p, sizeof p, stdin) // pattern string
&& fgets(r, sizeof r, stdin)) { // replace string
s[strcspn(s, "\n")] = '\0'; // strip newline if any
p[strcspn(p, "\n")] = '\0'; // strip newline if any
r[strcspn(r, "\n")] = '\0'; // strip newline if any
i = j = m = 0;
while (s[i] != '\0') {
if (s[m++] == p[j++]) {
if (p[j] == '\0') {
fputs(r, stdout);
i = m;
j = 0;
}
} else {
putchar(s[i++]);
j = 0;
m = i;
}
}
putchar('\n');
}
return 0;
}

关于c - C 中的字符串搜索和替换程序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45820626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com