猿问

在C中替换字符串的函数是什么?

在C中替换字符串的函数是什么?

给定一个(char*)字符串,我希望找到一个子字符串的所有匹配项,并将其替换为一个备用字符串。我没有看到任何简单的函数可以在<string.h>中实现这一点。



一只萌萌小番薯
浏览 1827回答 3
3回答

慕斯709654

优化器应该消除大多数局部变量。tmp指针的存在是为了确保strcpy不必遍历字符串才能找到空值。TMP指向每次呼叫后的结果结束。(见画家的算法为什么strcpy会很烦人。)//&nbsp;You&nbsp;must&nbsp;free&nbsp;the&nbsp;result&nbsp;if&nbsp;result&nbsp;is&nbsp;non-NULL.char&nbsp;*str_replace(char&nbsp;*orig,&nbsp;char&nbsp;*rep,&nbsp;char&nbsp;*with)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*result;&nbsp;//&nbsp;the&nbsp;return&nbsp;string &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*ins;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;next&nbsp;insert&nbsp;point &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*tmp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;varies &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;len_rep;&nbsp;&nbsp;//&nbsp;length&nbsp;of&nbsp;rep&nbsp;(the&nbsp;string&nbsp;to&nbsp;remove) &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;len_with;&nbsp;//&nbsp;length&nbsp;of&nbsp;with&nbsp;(the&nbsp;string&nbsp;to&nbsp;replace&nbsp;rep&nbsp;with) &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;len_front;&nbsp;//&nbsp;distance&nbsp;between&nbsp;rep&nbsp;and&nbsp;end&nbsp;of&nbsp;last&nbsp;rep &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;number&nbsp;of&nbsp;replacements &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;sanity&nbsp;checks&nbsp;and&nbsp;initialization &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!orig&nbsp;||&nbsp;!rep) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;len_rep&nbsp;=&nbsp;strlen(rep); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len_rep&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NULL;&nbsp;//&nbsp;empty&nbsp;rep&nbsp;causes&nbsp;infinite&nbsp;loop&nbsp;during&nbsp;count &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!with) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;=&nbsp;""; &nbsp;&nbsp;&nbsp;&nbsp;len_with&nbsp;=&nbsp;strlen(with); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;count&nbsp;the&nbsp;number&nbsp;of&nbsp;replacements&nbsp;needed &nbsp;&nbsp;&nbsp;&nbsp;ins&nbsp;=&nbsp;orig; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(count&nbsp;=&nbsp;0;&nbsp;tmp&nbsp;=&nbsp;strstr(ins,&nbsp;rep);&nbsp;++count)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins&nbsp;=&nbsp;tmp&nbsp;+&nbsp;len_rep; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;result&nbsp;=&nbsp;malloc(strlen(orig)&nbsp;+&nbsp;(len_with&nbsp;-&nbsp;len_rep)&nbsp;*&nbsp;count&nbsp;+&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!result) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;first&nbsp;time&nbsp;through&nbsp;the&nbsp;loop,&nbsp;all&nbsp;the&nbsp;variable&nbsp;are&nbsp;set&nbsp;correctly &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;from&nbsp;here&nbsp;on, &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;points&nbsp;to&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;result&nbsp;string &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;ins&nbsp;points&nbsp;to&nbsp;the&nbsp;next&nbsp;occurrence&nbsp;of&nbsp;rep&nbsp;in&nbsp;orig &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;orig&nbsp;points&nbsp;to&nbsp;the&nbsp;remainder&nbsp;of&nbsp;orig&nbsp;after&nbsp;"end&nbsp;of&nbsp;rep" &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(count--)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins&nbsp;=&nbsp;strstr(orig,&nbsp;rep); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len_front&nbsp;=&nbsp;ins&nbsp;-&nbsp;orig; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;strncpy(tmp,&nbsp;orig,&nbsp;len_front)&nbsp;+&nbsp;len_front; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;strcpy(tmp,&nbsp;with)&nbsp;+&nbsp;len_with; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orig&nbsp;+=&nbsp;len_front&nbsp;+&nbsp;len_rep;&nbsp;//&nbsp;move&nbsp;to&nbsp;next&nbsp;"end&nbsp;of&nbsp;rep" &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;strcpy(tmp,&nbsp;orig); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}

倚天杖

这在标准C库中没有提供,因为只要给定一个char*,如果替换字符串的长度大于要替换的字符串,则不能增加分配给该字符串的内存。您可以更容易地使用std:string来完成这一任务,但是即使在那里,也不会有单个函数为您完成此操作。

Qyouu

由于C中的字符串不能动态增长,所以内部替换通常不起作用。因此,您需要为有足够空间进行替换的新字符串分配空间,然后将部分从原始字符串再加上替换复制到新字符串中。复制要使用的部件斯特恩.
随时随地看视频慕课网APP
我要回答