snprintf是否始终为null终止目标缓冲区?
换句话说,这是否足够:
char dst[10];
snprintf(dst, sizeof (dst), "blah %s", somestr);
Run Code Online (Sandbox Code Playgroud)
或者你必须这样做,如果somestr足够长?
char dst[10];
somestr[sizeof (dst) - 1] = '\0';
snprintf(dst, sizeof (dst) - 1, "blah %s", somestr);
Run Code Online (Sandbox Code Playgroud)
我对标准所说的以及一些流行的libc可能做的不是标准行为感兴趣.
我正在通过visual studio 2008在win 7上运行一个程序
我收到此错误:
错误4错误C3861:'snprintf':找不到标识符
我已经包含了stdio标题...
我不知道还有什么可以遗漏
我正在编写一个C程序,预计将与所有主要编译器一起编译.目前我在Linux机器上开发GCC,并在提交代码之前在MSVC上编译.为了使交叉编译变得容易,我正在编译-ansi和-pedantic标记.这很有效,直到我开始使用snprintfC89标准中没有的.GCC可以在没有-ansi开关的情况下编译它,但MSVC将始终失败,因为它没有C99支持.
所以我做了类似的事情,
#ifdef WIN32
#define snprintf sprintf_s
#endif
Run Code Online (Sandbox Code Playgroud)
这很有效,因为snprintf并且sprintf_s具有相同的签名.我想知道这是正确的方法吗?
我目前正在将我们的一个Linux库的代码转换为Windows DLL.
在这个库中,我有一个函数,它以printf方式获取最后一个参数(格式字符串,然后是省略号).在这个函数中,我使用vsnprintf格式化提供的参数.因为我想知道我是否可以将最终字符串塞入一个小缓冲区,或者如果我必须为它分配内存,我有兴趣确定格式化字符串的"将是长度".
要做到这一点,我目前正在使用这样的vsnprintf(显然是组成示例代码):
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void foo(const char* fmt, ...)
{
int len = 0;
va_list ap;
va_start(ap, fmt);
len = vsnprintf(0, 0, fmt, ap);
printf("len = %d\n", len);
va_end(ap);
}
int main(void)
{
foo("12345%s", "67890");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
Open Group Base Specifications Issue 6涵盖了此用法:
vsnprintf(char*restrict s,size_t n,const char*restrict format,va_list ap)
[...] vsnprintf()[...]函数应等同于[...] snprintf().
snprintf(char*restrict s,size_t n,const char*restrict format,...)
如果在调用snprintf()时n的值为零,则不应写入任何内容,已写入的字节数n必须足够大,不包括终止空值,并且s可以是空指针.
当我使用/ analyze on在Windows系统(Visual Studio 2010)上编译此代码时出现问题.编译器/分析器给了我以下内容:
test.c(11):警告C6309:参数'1'为空:这不符合'vsnprintf'的函数规范
test.c(11):警告C6387:'参数1'可能是'0':这不符合函数'vsnprintf'的规范:行:7,8,10,11
如果buffer或 …
我有一些代码将variadic参数转换为a va_list,然后将列表传递给随后调用的函数vsnprintf.这在Windows和OS X上运行良好,但在Linux上却出现了奇怪的结果.
在以下代码示例中:
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
char *myPrintfInner(const char *message, va_list params)
{
va_list *original = ¶ms;
size_t length = vsnprintf(NULL, 0, message, *original);
char *final = (char *) malloc((length + 1) * sizeof(char));
int result = vsnprintf(final, length + 1, message, params);
printf("vsnprintf result: %d\r\n", result);
printf("%s\r\n", final);
return final;
}
char *myPrintf(const char *message, ...)
{
va_list va_args;
va_start(va_args, message);
size_t length = vsnprintf(NULL, 0, message, va_args);
char *final …Run Code Online (Sandbox Code Playgroud) 我正在研究C++ DDL,但是我在某些地方遇到了以下问题:
C4996 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Run Code Online (Sandbox Code Playgroud)
我确实尝试过#define _CRT_SECURE_NO_WARNINGS,但问题仍然存在.
这是代码:
sprintf(szDebugString, "%s: 0x%x (%s%s%i)", ptrName, (DWORD)funcPtr, interfaceName, interfaceVersion.c_str(), i);
Run Code Online (Sandbox Code Playgroud) 如果我这样做:
void printfloat(float number)
{
printf("%f", number);
}
Run Code Online (Sandbox Code Playgroud)
和
void printdouble(double number)
{
printf("%f", number);
}
Run Code Online (Sandbox Code Playgroud)
每个函数可以输出的最大字符数是多少?
我的程序在几个平台上运行.其中,Windows CE.目前,sprintf被广泛使用,导致缓冲区溢出等问题很多.我想用snprintf调用替换它们.对于Visual Studio,我发现了这个问题,它解决了问题的win32部分:
但我不能让它适用于Windows CE,因为函数_vsnprintf_s和_vscprintf,以及常量_TUNCATE都不可用.有人知道在Windows CE上复制snprintf(linux)行为的方法吗?
包括banned.h(微软安全工具之一)后,编译器给我一个警告,sprintf()功能是不是安全,和MSDN中心给了我一个建议使用sprintf_s,因为我的项目是跨平台的,我写了一个包装的sprintf函数.
//safe function for sprintf();
void WrapperSprintf( char *buffer, const char *format, ... )
{
#ifdef _WIN32
sprintf_s(buffer, sizeof(buffer), format,...);
#else
sprintf(buffer, format, ...);
#endif
}
Run Code Online (Sandbox Code Playgroud)
它给我一个错误 sprintf_s(buffer, sizeof(buffer), format,...);
错误C2059:语法错误:'...'
任何人都知道如何编写包装函数sprintf_s()?
非常感谢.
c ×6
printf ×4
c++ ×3
compilation ×1
libc ×1
portability ×1
posix ×1
visual-c++ ×1
windows ×1
windows-ce ×1