這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
將是將分配一個新的字符串,最安全的方法(編輯:解決的問題在評論中指出大衛保齡球。)
究竟是什麼問題?你遇到什麼錯誤?你有沒有試圖自己調試? – 54D
這兩段代碼之間的關係是什麼 –