社区
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下使用
...全文
936
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
作业
写回复
配置赞助广告
用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)
php
sprin
tf
小数,php
sprin
tf
函数
定义和
用法
sprin
tf
() 函数把格式化的字符串写写入
一个
变量中。
sprin
tf
(format,arg1,arg2,arg++)参数描述format必需。转换格式。arg1必需。规定插到 format 字符串中第
一个
% 符号处的参数。arg2可选。规定插到 ...
c语言参数中设置文件路径,
sprin
tf
函数中路径怎么设置 C语言里面
sprin
tf
函数使用
问题
...
C语言怎么使用
sprin
tf
函数新建多个自定义文件名的文件你的tmp分配的内存太小了 tmp的size为20最多只能储存20个字符 但是你的路径为c:\\``\\``\\``\\filename字符数大于20 显然会造成tmp的溢出 或者tmp只保留了20个...
matlab 打印多个变量,matlab中怎么输出
一个
变量的值
MATLAB的
sprin
tf
用法
几乎和C中的prin
tf
一样,参数都是prin
tf
(FORMAT,A,.)MATLAB的
sprin
tf
会返回
一个
字符串,当不使用分号;时,可以直接在屏幕输出。MATLAB的
sprin
tf
语法为[s,errmsg]=
sprin
tf
(format,A,.)可以把矩阵A...
snprin
tf
在GCC VC 上不同的行为及其探讨
本文援引自JeffHung.Blog。由于台湾和大陆在术语上并不统一,因此我对原文作了术语的改动,同时按照自己的一些理解...感谢jeffhung对该
问题
作出的探讨。 最近写程序的时候,发现不同的 compiler,其 snprint
go 许式伟 php,我的文章
许哥您好,
请教
一个
问题
:golang http.ResponseWriter 的Write()方法,服务的QPS由3万降到7000。附上我的测试代码和boom测试结果:现在我测试到的情况是这样的,如果我只填写http的header,那么服务端的处理速度很高...
C语言
70,026
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章