请教:vsprintf()的具体实现是这样的,即其函数体在哪里可以看到

ABLE__323 2006-04-10 11:48:41
要是您够好,就把函数体复制给我吧.
我主要是想知道在下面的一个函数中,szBuffer和vsprintf之间是建立了这样的联系,而vsprintf
最后又为什么可以返回该字符串的长度

int sprintf (char * szBuffer, const char * szFormat, ...)

{

int iReturn ;

va_list pArgs ;

va_start (pArgs, szFormat) ;

iReturn = vsprintf (szBuffer, szFormat, pArgs) ;//?

va_end (pArgs) ;

return iReturn ;

}
...全文
615 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ABLE__323 2006-04-11
  • 打赏
  • 举报
回复
首先谢谢你的回复,我对于你的再次解答是这么理解的:
   用pArgs取到后面的可变参数,然后将其替换到szFormat所指串的相应位置...最后将
  整个替换好的szFormat所指串复制到szBuffe[]中,是这样的吗?
  
ox_thedarkness 2006-04-11
  • 打赏
  • 举报
回复
VC7包含库的源文件,在安装目录\VC7\crt下
比如我机器上有 vfprintf.c :

C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\vfprintf.c


int __cdecl vfprintf (
FILE *str,
const char *format,
va_list ap
)
/*
* 'V'ariable argument 'F'ile (stream) 'PRINT', 'F'ormatted
*/
{
REG1 FILE *stream;
REG2 int buffing;
REG3 int retval;

_ASSERTE(str != NULL);
_ASSERTE(format != NULL);

/* Init stream pointer */
stream = str;

#ifdef _MT
_lock_str(stream);
__try {
#endif /* _MT */

buffing = _stbuf(stream);
retval = _output(stream,format,ap );
_ftbuf(buffing, stream);

#ifdef _MT
}
__finally {
_unlock_str(stream);
}
#endif /* _MT */

return(retval);
}

其中涉及到其他函数亦可以在此找到... 这类库代码一般代码牵一发动全身... 一扯牵出来一大串... 楼主加油
ox_thedarkness 2006-04-11
  • 打赏
  • 举报
回复
- _ - 这个主要是字符串分析,其实不难。 你可以先研究一下字符串 replace :

给出字符串 src,目标字符串 dest(假定dest足够大), 需要替换的字符串 patten, 替换到的字符串 target。

给出一个replace算法将 src 中所有 patten 替换为 target, 写到 dest 中(除了dest以外,其他字符串都只读)。


如果楼主还是研究不出来,就跳过他,打打基础把...
ABLE__323 2006-04-11
  • 打赏
  • 举报
回复
很感谢,但是真的是看不懂.
我的感觉是他借助这句retval = _output(stream,format,ap );就将问题解决了.那
_output(stream,format,ap );又是怎么实现的啊....哎,头都大了,早知道不学编程了.
有没有好心人可以直接告诉我:
    1.vsprintf()是怎样将szFormat赋给了szBuffe[],其中pArgs起到了什么作用
    2.vsprintf最后又为什么可以返回该字符串的长度
    3.最好的是如果您对vsprintf()有很好的理解,请用伪代码将它的3个参数之间       的关系表示一下好吗?大概的意识就可以了
我可能没法给您加分了,但是如果有谁解决了这个问题,我会非常感谢

ABLE__323 2006-04-11
  • 打赏
  • 举报
回复
非常感谢了:)
ox_thedarkness 2006-04-11
  • 打赏
  • 举报
回复
反了. pArgs 只是一个指针,你不知道里面到底有多少个元素

反过来, szFormat 是字符串,他是确定的。 你顺着扫描,边扫描边输出到str中。 看见一个需要替换的标志就在 pArgs 里面取一个对应大小的内容,转换输出到 str 中,继续扫描直到完成。



这也是 printf 族的固有问题所在 —— 语言不能对类型进行匹配监测。假如你提供的参数类型与说明不符,就会导致运行时bug甚至程序崩溃。

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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