相关疑难解决方法(0)

snprintf()总是null终止?

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可能做的不是标准行为感兴趣.

c posix libc

73
推荐指数
4
解决办法
5万
查看次数

错误4错误C3861:'snprintf':找不到标识符

我正在通过visual studio 2008在win 7上运行一个程序

我收到此错误:

错误4错误C3861:'snprintf':找不到标识符

我已经包含了stdio标题...

我不知道还有什么可以遗漏

c++ printf visual-studio-2008 visual-c++

13
推荐指数
1
解决办法
4万
查看次数

在跨平台应用程序中使用snprintf

我正在编写一个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具有相同的签名.我想知道这是正确的方法吗?

c portability cross-platform compilation

11
推荐指数
3
解决办法
2万
查看次数

Unix到Windows:替代vsnprintf来确定长度?

我目前正在将我们的一个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

快速浏览一下vsnprintfMSDN条目给了我:

如果buffer或 …

c windows visual-studio-2010

11
推荐指数
1
解决办法
7016
查看次数

Linux上的va_list错误行为

我有一些代码将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 = &params;
    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 variadic-functions

8
推荐指数
2
解决办法
4237
查看次数

此功能或变量可能不安全.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS

我正在研究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)

c++

6
推荐指数
3
解决办法
1万
查看次数

输出float和double变量时sprintf输出的最大字符数是多少?

如果我这样做:

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)

每个函数可以输出的最大字符数是多少?

c printf

5
推荐指数
2
解决办法
5534
查看次数

用于Windows CE的snprintf

我的程序在几个平台上运行.其中,Windows CE.目前,sprintf被广泛使用,导致缓冲区溢出等问题很多.我想用snprintf调用替换它们.对于Visual Studio,我发现了这个问题,它解决了问题的win32部分:

snprintf和Visual Studio 2010

但我不能让它适用于Windows CE,因为函数_vsnprintf_s_vscprintf,以及常量_TUNCATE都不可用.有人知道在Windows CE上复制snprintf(linux)行为的方法吗?

c printf windows-ce visual-studio

5
推荐指数
1
解决办法
612
查看次数

C++,sprintf_s的包装函数

包括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++ printf

2
推荐指数
1
解决办法
3276
查看次数