我编写了以下代码,目的是在字符串上使用指针算法来查找和替换目标子字符串.显然,它不优雅,但不幸的是它也是不正确的 - 它为字符串添加了无关的字符.
#include <stdio.h>
#include <string.h>
int main() {
char string[] = "The quick brown fox jumped over the lazy dog.";
char target[] = "brown"
char replacement[] = "ochre";
char segment[80+1];
char pre_segment[80+1];
char post_segment[80+1];
int S = strlen(string), T = strlen(target);
for (int i = 0; i < S; i++) {
strncpy(segment, string + i, T);
if (strcmp(segment, target) == 0) {
>>> strncpy(pre_segment, string, i); <<<
strncpy(post_segment, string + i + T,
S - (i + T));
strcat(pre_segment, replacement);
strcat(pre_segment, post_segment);
printf("%s\n", pre_segment);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在标记为>>> this <<<的行之后,在将替换与pre_segment连接之前,已经预先替换了无关字符.
有人可以给我一些如何调试的建议吗?(建议更好的解决方案也欢迎,但请尽量明确.另外,我不应该为此使用动态内存分配.)
不要用strncpy.它几乎肯定不会做你认为它做的事情.特别是,它不保证NUL终止,同时愚弄人们认为它确实如此.如果要精确复制n字符,请使用memcpy(dest, src, n);然后显式NUL-terminate with dest[n] = '\0';.缺少NUL终止可能会导致您的问题.(检查你的调试器!)
但是,根本不需要这样做strncpy.使用strncmp或memcmp.(仅memcmp当您知道strlen(target)字符串中至少剩余字节时才使用.)如果strlen(target)字节从string匹配中的某个点开始target,那么您已找到匹配项.
更好的是用于strstr查找下一个字符串.
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |