strcpy()删除其他所有内容

时间:2017-02-16 03:59:41

标签: c

我需要阅读一个文件并查找一个单词并替换为一个新单词,但它不能正常工作:

#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);

感谢

1 个答案:

答案 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在评论中指出的问题。)