字符串替换

作者在 2008-10-25 00:36:41 发布以下内容
今天去面试,给了个题:
要求把字符串 “sdjaabcasdkk;3asd,abcadapabcadp” 中的 子串“abc”使用 “zhong” 替代得到一个新的字符串
看着这个好像挺简单的,竟然花了我好长时间!!真是郁闷

#include <stdio.h>
#include <string.h>

char *source = "sadaabcadadjalabcdd";

int main()
{
    char dec[100] = {0};
    int i;
    char *pstr = source;
    char *pstr1 = dec;
    printf("%s\n",source);

    for (i=0;i<(signed)strlen(source);i++)
    {
        if (0==strncmp(pstr,"abc",3))
        {
            strcat(dec,"zhong");
            pstr += strlen("abc");
            pstr1 += strlen("zhong");
        }
        else
        {
            dec[(pstr1-dec)] = *pstr;
            dec[(pstr1-dec)+1] = 0;
            pstr += 1;
            pstr1 += 1;
        }
    }

    printf("%s\n",dec);
    return 0;

}
上面是我的答案,希望和大家一起探讨下,由什么更加高效的算法
求职 | 阅读 5035 次
文章评论,共6条
vfdff(作者)
2008-10-25 07:52
1
C格式字符串转string可以直接转 <br />
string str; <br />
str = &quot;Hello World!&quot;; <br />
<br />
string转C格式 <br />
string str = &quot;Hello World!&quot;; <br />
char *str = str.c_str();
vfdff(作者)
2008-10-25 13:55
2
改进算法:<br />
#include &lt;stdio.h&gt;<br />
// #include &lt;string.h&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
<br />
const char *source = &quot;sadaabcadadjalabcdd&quot;;<br />
<br />
int main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::string target;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;const char *pstr = source;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s\n&quot;,source);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i&lt;(signed)strlen(source);i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (0==strncmp(pstr,&quot;abc&quot;,3))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target += &quot;zhong&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr += strlen(&quot;abc&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target += *pstr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr += 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt;target &lt;&lt;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// printf(&quot;%s\n&quot;,target.c_str()); // 不能直接使用printf(&quot;%s\n&quot;,target);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
<br />
}
shan_0823
2008-11-12 14:48
3
void test2()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char *source = &quot;sadaabcadadjalabcdd&quot;;<br />
&nbsp;&nbsp;&nbsp; char dec[100] = {0};<br />
&nbsp;&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp;&nbsp; char *pstr = source;<br />
&nbsp;&nbsp;&nbsp; char *pstr1 = dec;<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%s\n&quot;,source);<br />
<br />
&nbsp;&nbsp;&nbsp; for (i=0;i&lt;(signed)strlen(source);i++)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (0==strncmp(pstr,&quot;abc&quot;,3))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(pstr1,&quot;zhong&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr += strlen(&quot;abc&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr1 += strlen(&quot;zhong&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pstr1++ = *pstr++;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; *pstr1 = 0;<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%s\n&quot;,dec);<br />
}<br />
<br />
改进后充分利用指针的优势..
vfdff(作者)
2008-11-13 00:44
4
<div class="quote"><span class="q"><b>shan_0823</b>: void test2()   {   &nbsp;&nbsp;&nbsp;&nbsp;char *source = &quot;sadaabcadadjalabcdd&quot;;   &nbsp;&nbsp;&nbsp; char dec  = {0};   &nbsp;&nbsp;&nbs</span></div>恩,不错,谢谢指教
vfdff(作者)
2008-11-14 19:40
5
// 将 shan_0823: 的指针操作版本修改为数组操作<br />
<br />
#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
<br />
char *source = &quot;sadaabcadadjalabcdd&quot;;<br />
<br />
int main()<br />
{<br />
&nbsp;&nbsp;&nbsp; char dec[100] = {0};<br />
&nbsp;&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp;&nbsp; //char *pstr = source;<br />
&nbsp;&nbsp;&nbsp; //char *pstr1 = dec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;char pstr=0,pstr1=0;<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%s\n&quot;,source);<br />
<br />
&nbsp;&nbsp;&nbsp; for (i=0;i&lt;(signed)strlen(source);i++)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (0==strncmp(source+pstr,&quot;abc&quot;,3))&nbsp;&nbsp;// 地址值source+pstr <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(dec,&quot;zhong&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr += strlen(&quot;abc&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstr1 += strlen(&quot;zhong&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dec[pstr1++] = source[pstr++];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dec[pstr1] = 0;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%s\n&quot;,dec);<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}
vfdff(作者)
2010-07-02 20:41
6
#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
//#include &lt;string&gt;<br />
<br />
char* source = &quot;sadaabcadadjalabcdd&quot;;<br />
char dec[1024] = {0};<br />
&nbsp; &nbsp; <br />
<br />
// 把字符串str中的子字符串substr1用子字符串substr2替换<br />
char* SwapSubstr(char *dest, char *source, char*substr1, char*substr2)<br />
{<br />
&nbsp; &nbsp; char *pstr = source;<br />
&nbsp; &nbsp; char *pstr1 = dest;<br />
&nbsp; &nbsp; unsigned int i;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; for (i=0;i&lt;strlen(source)-strlen(substr1)+1;i++)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (0==strncmp(pstr,substr1,strlen(substr1)))<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;strcat(pstr1,substr2);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;pstr += strlen(substr1);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;pstr1 += strlen(substr2);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;*pstr1++ = *pstr++;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; *pstr1 = 0;<br />
&nbsp; &nbsp; return dest;<br />
}<br />
<br />
int main()<br />
{<br />
&nbsp; &nbsp; printf(&quot;++%s\n&quot;, SwapSubstr(dec, source, &quot;abc&quot;, &quot;zhong&quot;));<br />
&nbsp; &nbsp; return 0;<br />
}<br />
<br />
封装成子函数
游客请输入验证码
浏览1943043次