我需要阅读一个文件并查找一个单词并替换为一个新单词,但它不能正常工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE * f = fopen("text" , "rb" );
if(f == NULL ){
perror("error ");
return 1;
}
char chain[100];
while(!feof(f)){
fgets(chain, 100 , f);
}
printf("%s", chain);
fclose(f);
printf("\n \n ;D \n");
return 0;
}
这就是我取代旧词的方式:
char str[] ="This is a hiall samplesss friends string";
char * pch;
pch = strstr (str,"hiall");
strncpy (pch,"sam",5);
puts (str);
感谢
答案 0 :(得分:1)
strncpy
正在将"sam"
中的5个字符复制到pch
。但请注意,"sam"
只有3个字符,因此它复制了三个字符加上\0
终止符。这就是&#34;删除&#34;字符串的其余部分:它是在&#34; sam&#34;之后添加终结符,因此您在输出中得到This is a sam
。
如果你只拼写3个字符,你就会得到这个:
This is a samll samplesss friends string
如果您想要的是找到和替换(即替换&#34; hiall&#34;用&#34; sam&#34;并获得This is a sam samplesss friends string
),您需要移动其余部分向后的字符串。一个简单的strncpy
不会起作用,因为目标内存与目标重叠。为此,您可以使用memmove
,也可以使用辅助缓冲区:
char str[] = "This is a hiall samplesss friends string";
char* pch;
char* old_word = "hiall";
char* new_word = "sam";
size_t len_old = strlen(old_word);
size_t len_new = strlen(new_word);
pch = strstr(str, old_word);
assert(len_new <= len_old);
if (pch) {
char* rest = pch + len_old;
size_t len_rest = strlen(rest);
char* aux = malloc(len_rest + 1);
strncpy(aux, rest, len_rest + 1);
strncpy(pch, new_word, len_new);
strncpy(pch + len_new, aux, len_rest + 1);
free(aux);
puts(str);
}
请注意,仅当new_word
的尺寸相同或者比old_word
短时,此功能才有效。如果new_word
更长,则您无法就地编辑(在字符串str
中),除非原始字符串具有额外的内存(例如,如果您使用str[1000]
以保证您可以充分增加其大小 - 然后上面的代码就可以了。如果您无法提前计划new_word
的大小,那么最安全的方法是分配一个新的字符串:
char str[] ="This is a hiall samplesss friends string";
char* pch;
char* old_word = "hiall";
char* new_word = "sam";
pch = strstr(str, old_word);
size_t len_str = strlen(str);
size_t len_new = strlen(new_word);
size_t len_old = strlen(old_word);
if (pch) {
char* new_str = malloc(len_str - len_old + len_new + 1);
ptrdiff_t pos_word = pch - str;
strncpy(new_str, str, pos_word);
strncpy(new_str + pos_word, new_word, len_new);
strncpy(new_str + pos_word + len_new, pch + len_old,
len_str - pos_word - len_old + 1);
puts(new_str);
}
(编辑:David Bowling在评论中指出的问题。)