2017-02-16 32 views
-1

我需要讀取一個文件,並尋找一個字,並用一個新詞取代,但它不工作,因爲它應該:的strcpy()刪除一切

#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

究竟是什麼問題?你遇到什麼錯誤?你有沒有試圖自己調試? – 54D

+0

這兩段代碼之間的關係是什麼 –

回答

1

strncpy被複制從"sam" 5個字符爲pch。但請注意,"sam"只有3個字符,因此它正在複製三個字符加上終止符\0。這就是爲什麼它會「刪除」字符串的其餘部分:它會在「sam」之後添加一個終止符,因此您在輸出中獲得了This is a sam

如果你只函數strncpy 3個字符,你會得到這樣的:

This is a samll samplesss friends string

如果你想要的是像查找和替換(即「SAM」代替「hiall」並獲得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]以確保足夠增加其大小 - 那麼上面的代碼將工作)。

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

:如果不能未雨綢繆什麼規模new_word將是將分配一個新的字符串,最安全的方法(編輯:解決的問題在評論中指出大衛保齡球。)

+0

非常感謝你!很好的解釋 –

+0

@DavidBowling:哎呀,我專注於解釋和代碼結束了快速和草率。改進它,謝謝! –