sprintf拼接字符串的问题

时间:2008-05-09 19:07:11   来源:论坛整理  作者:  编辑:chinaitzhe
想给一个字符串前面添加一些信息,先贴源码:

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

int main(int argc, char* argv[])
{
char buf[100];

memset(buf, 0, sizeof(buf));

//先给定初始值
sprintf(buf, "%s", "test");

//拼构字符
sprintf(buf, "www.%s", buf);

printf(buf);
printf("\n");

return 0;
}

大家猜下结果是什么?

实际输出结果为:
www.www.

原因是什么,大家想想。
我的问题是除了通过增加临时变量外,还有没有其他的方法来实现该目标。



网友回复:char string[80];
strcpy( string, "Hello world from " );
strcat( string, "strcpy " );
strcat( string, "and " );
strcat( string, "strcat!" );
printf( "String = %s\n", string );

网友回复:到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



    sprintf(buf 50, "www.%s",buf); 

    sprintf(buf, buf 50);


网友回复:
引用 2 楼 Mnky 的回复:
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了

网友回复:
CSS code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



永远不要用sprintf

              -------Herb sutter


网友回复:
引用 2 楼 Mnky 的回复:
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了


一直很想学学汇编

vc6里F11的汇编是什么体系的汇编?
网友回复:你这哪是拼接呀,这不就是覆盖了吗?
网友回复:
引用 2 楼 Mnky 的回复:
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了

谁能解决下这汇编代码
网友回复:
引用 6 楼 guanqb 的回复:
引用 2 楼 Mnky 的回复:
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了


一直很想学学汇编

vc6里F11的汇编是什么体系的汇编?


当然是Intel 的 Win32汇编
网友回复://老老实实的多好

char buf[100];
char temp[32];
memset(buf, 0, sizeof(buf));

//先给定初始值
sprintf(buf, "%s", "test");
printf(buf);
strncpy(temp,buf,32);
memset(buf, 0, sizeof(buf));
//拼构字符
sprintf(buf, "www.%s", temp);

printf(buf);
printf("\n");

return 0;

网友回复:
引用楼主 perddy 的帖子:
想给一个字符串前面添加一些信息,先贴源码:

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

int main(int argc, char* argv[])
{
char buf[100];

memset(buf, 0, sizeof(buf));

//先给定初始值
sprintf(buf, "%s", "test");

//拼构字符
sprintf(buf, "www.%s", buf);

printf(buf);
printf("\n");

return 0;
}

大家猜下结果是什么?

实际输出结果为:
www…


我是这样理解的
sprintf(buf, "www.%s", buf);
一个一个的复制
首先前面www.先一个个得覆盖掉原来buf里的内容 到了%s时 buf里的内容已经被替换为www.所以就变成
www.www.
网友回复:用strcat()连接
网友回复:增加一个额外空间 总比你出错的好

网友回复:snprintf()比sprintf()要好很多
网友回复:谢谢各位的回复,这样写是受CString 运算影响(CString temp = "test";temp = "www." temp;)
结果出问题了。看起来还是乖乖的用临时变量的好~~

要说明几点:
1、程序是需要往字符串前面添加信息,所以没有用strcat;
2、另外用的sprintf,而没有用_snprintf是因为写起来简单,
实际上sprinf和_snprintf的区别仅仅是_snprintf多了指定字符最大数。
(关于这点大家可以看下sprintf.c文件)
3、至于返回结果是www.www.的原因,zmlovelx基本上已经解释了。是出现了覆盖的情况。


网友回复:
引用 12 楼 NKLoveRene 的回复:
用strcat()连接


就是!
网友回复:学习
关键字:sprintf,拼接,字符串,问题,
上一篇:1分

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面