社区
C语言
帖子详情
请教一个简单的问题:sprintf的用法
dhdhdh
2006-05-14 06:12:39
读代码发现:
sprintf(prs_buf,"%s%s",prs_buf,prs_word);
的用法,注意是prs_buf给sprintf到prs_buf,自己输出给自己
但是结果和
printf(prs_buf,"%s%s",prs_buf,prs_word);
不一致,为什么?
注:此段代码是在unix下使用
...全文
917
32
打赏
收藏
请教一个简单的问题:sprintf的用法
读代码发现: sprintf(prs_buf,"%s%s",prs_buf,prs_word); 的用法,注意是prs_buf给sprintf到prs_buf,自己输出给自己 但是结果和 printf(prs_buf,"%s%s",prs_buf,prs_word); 不一致,为什么? 注:此段代码是在unix下使用
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
32 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dhdhdh
2006-05-16
打赏
举报
回复
不好意思,今天才来结贴!
谢谢大家的帮助!
code_tin
2006-05-15
打赏
举报
回复
char * __cdecl strcat (
char * dst,
const char * src
)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
帖一下VC6的strcat实现
是没什么临时变量的。所以用这代替sprintf确实好许多
code_tin
2006-05-15
打赏
举报
回复
原来stidio_zhougang(回头是岸)说过了。没仔细看帖。该打。村长来扣我专家分吧。。。
code_tin
2006-05-15
打赏
举报
回复
哦。知道了。没事了。结帖。
铖邑
2006-05-15
打赏
举报
回复
好好想想吧,不多说了。楼上的想弄明白,干脆开个帖子吧
code_tin
2006-05-15
打赏
举报
回复
这时buf是1oy,先输入第一个字符,这样buf[1]='1'
如果这样那么%s,buf
应该变成bbb了。。。
铖邑
2006-05-15
打赏
举报
回复
很简单啊,格式1%s的第一个字符是1,那么buf[0]='1',这个是很显然的。接下来,是%s,这时buf是1oy,先输入第一个字符,这样buf[1]='1',于是buf是11y。接下来还是一样,111,然后就是'\0',于是%s处理结束。
没问题吧?
code_tin
2006-05-15
打赏
举报
回复
等下结
我还不知道为什么sprintf(buf,“1%d”,buf)
会是1111
而不是1boy
或者1oy
或者1bo
code_tin
2006-05-15
打赏
举报
回复
可能他知道或者觉得strcat内部实现里面会有引入一个临时变量
又可能他完全不知道或者没想起来strcat这个函数。
结帖以后我不要分。
铖邑
2006-05-15
打赏
举报
回复
这个话题可以结束了。楼主结帖吧
铖邑
2006-05-15
打赏
举报
回复
strcat(prs_buf,prs_word);
这句话需要临时变量吗???晕死
code_tin
2006-05-15
打赏
举报
回复
习惯???难道这样写会比strcat好吗?自己复制自己为啥啊???
============================
省却一个临时变量
code_tin
2006-05-15
打赏
举报
回复
#include "stdio.h"
main()
{
char buf[256]="boy";
sprintf(buf, "1%s abc", buf);
printf("%s\n",buf);
}
结果:
1111 abc
我试着分析一下
首先他会判断后面参数的长度。然后一位一位的复制到目标指针里面
sprintf(buf, "1%s abc", buf);
先打印1到buf里面
这个时候buf的内容就是1
然后重复复制buf原始长度次数
就是复制了3个1到buf里面
这样前面就变成1111
然后加上后面的 abc
这个情况可能有些类似递归
需要看汇编代码才能确定它到底搞了什么
这里贴出关键的ASM代码
; 10 : char buf[256]="boy";
push 252 ; 000000fcH
lea eax, DWORD PTR _buf$[esp+268]
push 0
push eax
mov DWORD PTR _buf$[esp+272], 7958370 ; 00796f62H
call _memset
; 11 : sprintf(buf, "2%s", buf);
lea ecx, DWORD PTR _buf$[esp+272]
push ecx
mov edx, ecx
push OFFSET ??_C@_03LOANLOPH@2?$CFs?$AA@
push edx
call DWORD PTR __imp__sprintf
; 12 : printf("%s\n",buf);
lea eax, DWORD PTR _buf$[esp+284]
push eax
push OFFSET ??_C@_03OFAPEBGM@?$CFs?6?$AA@
call DWORD PTR __imp__printf
可惜他只是去调用sprintf。所以还是没法看出什么
还是需要跟踪进去。我懒得做了。看谁跟进去看看
FallenAngel
2006-05-15
打赏
举报
回复
具体看sprintf库的实现,不过到目前为止,我看到的sprintf实现似乎都会第一步把buffer清空,所以连接不会成功
铖邑
2006-05-15
打赏
举报
回复
习惯???难道这样写会比strcat好吗?自己复制自己为啥啊???
code_tin
2006-05-15
打赏
举报
回复
没什么歧义阿
既然了解sprintf的用法
那么这个就是把两串字符串合并以后放到第一个参数所指的字符串
高手用这个的原因
不外乎是他习惯了这种写法
因为sprintf比strcat可以更多样化的使用,因为可以通过%来控制输出
这样写可以省却一个临时变量
所以这样写咯
stidio_zhougang
2006-05-15
打赏
举报
回复
看看sprintf的汇编实现吧
sprintf并不会申请什么临空间,借xpdavis的代码我分析一下
首先,输入1的时候,buf的数据变为buf[256] = "1oy"
然后%s输入,首先输入buf[0]为1,这时候buf[256]="11y" 然后是buf[1]还是为1,这时候变为buf[256]="111",然后是buf[2],还是为1,这时候buf[3]=0,结束,后面的不在多说...
pacman2000
2006-05-15
打赏
举报
回复
这种写法本来就不如strcat好。在sprintf过程中改变buf本身只会导致未定义的行为。
铖邑
2006-05-14
打赏
举报
回复
只是最好不要这样用吧。如果这样写呢?sprintf(prs_buf,"1%s%s",prs_buf,prs_word);
各位可以看看这样写的结果。
#include "stdio.h"
main()
{
char buf[256]="boy";
sprintf(buf, "1%s abc", buf);
printf("%s\n",buf);
}
结果:
1111 abc
各位想想看为什么?
就算是大虾写的,我也是要说的!
铖邑
2006-05-14
打赏
举报
回复
sprintf(prs_buf,"%s%s",prs_buf,prs_word);这样写可能没问题
加载更多回复(11)
c语言参数中设置文件路径,
sprin
tf
函数中路径怎么设置 C语言里面
sprin
tf
函数使用
问题
...
C语言怎么使用
sprin
tf
函数新建多个自定义文件名的文件你的tmp分配的内存太小了 tmp的size为20最多只能储存20个字符 但是你的路径为c:\\``\\``\\``\\filename字符数大于20 显然会造成tmp的溢出 或者tmp只保留了20个字符那么不完整的路径很显然是无法创建成功的linux中
sprin
tf
函数怎么用
sprin
tf
函数的作用是格式化
一个
字符串,和prin
tf
函数有...
php
sprin
tf
小数,php
sprin
tf
函数
定义和
用法
sprin
tf
() 函数把格式化的字符串写写入
一个
变量中。
sprin
tf
(format,arg1,arg2,arg++)参数描述format必需。转换格式。arg1必需。规定插到 format 字符串中第
一个
% 符号处的参数。arg2可选。规定插到 format 字符串中第二个 % 符号处的参数。arg++可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。说明参数 ...
matlab 打印多个变量,matlab中怎么输出
一个
变量的值
在MATLAB中,可以使用
sprin
tf
来格式化输出变量。MATLAB的
sprin
tf
用法
几乎和C中的prin
tf
一样,参数都是prin
tf
(FORMAT,A,.)MATLAB的
sprin
tf
会返回
一个
字符串,当不使用分号;时,可以直接在屏幕输出。MATLAB的
sprin
tf
语法为[s,errmsg]=
sprin
tf
(format,A,.)可以把矩阵A做数据格式的转换,格式就是format参数。例...
『操作系统』读者-写者
问题
(读者优先),
简单
的解决方法
大二下学期的操作系统实验,本项目含源代码、实验报告,
简单
的解决方法。
一个
Marshal.Copy的
问题
首先介绍下这个
问题
的背景,是来自很久前
一个
同事问我
请教
的
问题
,当时我也没搞清楚,还去88上问了下。现在我有些空余时间,在88上有看到了自己的提问,想想有必要研究清楚这个
问题
到底是怎么回事。 其次我要对中文MSDN的文档表达以下不满,正是由于MSDN的中文文档对这个函数的介绍的语义比较模糊,不精确,才导致我当时无法理解清楚这个函数的设计用意和用途是什么。 第三,我要顺便鄙视下.n
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章