C语言snprintf()函数:将格式化的数据写入字符串—sprintf()
函数名:vsnprintf
原型:int _vsnprintf(char *buffer, size_t max_count, const char *format, va_list vArgList);
功能:类同vsprintf,加了max_count限制。
参数:
返回值:如果成功调用此函数,返回写到buffer中的字符的个数(不包括结尾的'\0')。snprintf和vsnprintf函数不能够写多于size大小(包括结尾的'0')的字节数。如果输出因为以上原因被截
断,返回成功写入buffer的字符数(不包括结尾的'\0'),如果有足够的内存空间的话。所以,如果返回值等于size或者大于size,表示输出到buffer的字符被截断,如果输出过程中遇到错误,则
返回一个负数。
函数名:vsprintf
原型:int vsprintf(char *string, char *format, va_list param);
功能:将param 按格式format写入字符串string中。
参数:va_list可变参数
返回值:正常情况下返回生成字串的长度(除去\0),错误情况返回负值
把data type 转换成为string 类型,存储到buffer 中.
函数名:snprintf
原型:int snprintf(char *str, size_t size, const char *format, ...);
功能:将可变个参数(...)按照format格式化成字符串,然后将其复制到str中,返回写入str中的字符串的长度,所以可以利用snprintf函数来提前获取需要的内存空间大小。
参数:
返回值:函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值
事实上,LLVM C++库函数ostream 就是使用__libcpp_snprintf_l (wrapper of snprintf), 我因为没有把该函数所在的头文件 include/__bsd_locale_fallbacks.h 包含到不同的头文件导致数据转出string (ostream)再转换回来(istream),值就变了。 因为我们总是在调用先编译的ASCII 版本的__libcpp_snprintf_l 导致,EBCDIC 版本被linker silently 丢弃了(stupid 设计)。 把__libcpp_snprintf_l 放到不同的namespace 里面(ASCII or EBCDIC)之后,从新便于(local.ebcdic.o local.ascii.o 分别包含ASCII 和EBCDIC 版本的__libcpp_snprintf_l 问题解决!!!!!!)
经验总结: gdb 神器啊,没有它debug code 到死啊。能用gdb绝对不printf 啊!!!
No comments:
Post a Comment