sprintf拼接字符串的问题

perddy 2008-05-09 11:27:04
想给一个字符串前面添加一些信息,先贴源码:

#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.

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


...全文
737 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieao111 2008-05-09
  • 打赏
  • 举报
回复
永远不要用sprintf
-------Herb sutter
tianloveyou 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Mnky 的回复:]
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了
[/Quote]
baihacker 2008-05-09
  • 打赏
  • 举报
回复
	sprintf(buf+50, "www.%s",buf); 
sprintf(buf, buf+50);
Mnky 2008-05-09
  • 打赏
  • 举报
回复
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了
laolaoliu2002 2008-05-09
  • 打赏
  • 举报
回复
char string[80];
strcpy( string, "Hello world from " );
strcat( string, "strcpy " );
strcat( string, "and " );
strcat( string, "strcat!" );
printf( "String = %s\n", string );
CHHannibal 2008-05-09
  • 打赏
  • 举报
回复
学习
冷月清晖 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 NKLoveRene 的回复:]
用strcat()连接
[/Quote]

就是!
perddy 2008-05-09
  • 打赏
  • 举报
回复
谢谢各位的回复,这样写是受CString 运算影响(CString temp = "test";temp = "www." + temp;)
结果出问题了。看起来还是乖乖的用临时变量的好~~

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

NKLoveRene 2008-05-09
  • 打赏
  • 举报
回复
snprintf()比sprintf()要好很多
帅得不敢出门 2008-05-09
  • 打赏
  • 举报
回复
增加一个额外空间 总比你出错的好
NKLoveRene 2008-05-09
  • 打赏
  • 举报
回复
用strcat()连接
帅得不敢出门 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 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…
[/Quote]

我是这样理解的
sprintf(buf, "www.%s", buf);
一个一个的复制
首先前面www.先一个个得覆盖掉原来buf里的内容 到了%s时 buf里的内容已经被替换为www.所以就变成
www.www.
冷月清晖 2008-05-09
  • 打赏
  • 举报
回复
//老老实实的多好

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;
星光伴月 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guanqb 的回复:]
引用 2 楼 Mnky 的回复:
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了


一直很想学学汇编

vc6里F11的汇编是什么体系的汇编?
[/Quote]

当然是Intel 的 Win32汇编
帅得不敢出门 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Mnky 的回复:]
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了
[/Quote]
谁能解决下这汇编代码
星光伴月 2008-05-09
  • 打赏
  • 举报
回复
你这哪是拼接呀,这不就是覆盖了吗?
guanqb 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Mnky 的回复:]
到 sprintf(buf, "www.%s", buf); 这句按F11,看看汇编代码就知道了
[/Quote]

一直很想学学汇编

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

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧