C 当maxlen>;时,如果snprintf不写入任何内容,它将返回什么;0?

C 当maxlen>;时,如果snprintf不写入任何内容,它将返回什么;0?,c,printf,C,Printf,根据我对C标准的阅读,如果写入时snprinf达到maxlen,它将返回一个正值或负值(实际上不清楚),其大小等于未能写入的字符数。该规范还指出,如果出现任何错误,该函数将返回负值。所以我的问题是:在以下两种情况下,它会返回什么 Maxlen>0,在发生错误之前不会写入任何字符,snprintfbail Maxlen>0,所有字符都已写入,出现某种错误,snprintfbail 我意识到,特别是最后一次,可能性不大。但我想更好地理解规范。在我看来,snprintf的返回使得您是否正确地编写了字符

根据我对C标准的阅读,如果写入时
snprinf
达到
maxlen
,它将返回一个正值或负值(实际上不清楚),其大小等于未能写入的字符数。该规范还指出,如果出现任何错误,该函数将返回负值。所以我的问题是:在以下两种情况下,它会返回什么

Maxlen>0
,在发生错误之前不会写入任何字符,
snprintf
bail

Maxlen>0
,所有字符都已写入,出现某种错误,
snprintf
bail

我意识到,特别是最后一次,可能性不大。但我想更好地理解规范。在我看来,snprintf的返回使得您是否正确地编写了字符串的一部分变得模棱两可

        • 编辑
显然这还不清楚。让我详细说明:

*>哪个负数无关紧要。错误就是错误,它不是

不管发生之前写入了多少字节。 这可能是大多数人的实际情况。但是,我看到snprintf应该返回多余的字符数,我想知道是否可以使用该值。 我觉得奇怪的是,规范会遇到麻烦,报告一些有用的东西,但却对它是否真的返回了一些不相关的东西留下了模棱两可的印象。这不合理吗? 我想知道是否有更多的约定可以确定snprintf是否因为输入太多而失败*

我现在明白了。我看到除截断以外的任何错误都是负的,成功是0 返回值

成功返回后,这些函数返回打印的字符数(不包括用于结束字符串输出的空字节)


函数snprintf()和vsnprintf()的写入长度不超过大小字节(包括终止的空字节('\0'))。如果由于此限制而截断了输出,则返回值是在有足够空间的情况下写入最终字符串的字符数(不包括终止的空字节)。因此,返回值大于等于size意味着输出被截断。(另请参见下面的注释。)

如果遇到输出错误,则返回负值

因此,对于您的案例:

Maxlen>0
,在发生错误之前不会写入任何字符,
snprintf
bail

snprintf
返回一个负数。哪个负数无关紧要

Maxlen>0
,所有字符都已写入,出现某种错误,snprintf退出

snprintf
返回一个负数。哪个负数无关紧要。错误是一种错误,它与发生之前写入了多少字节无关。

中的描述:

返回值

成功返回后,这些函数返回打印的字符数(不包括用于结束字符串输出的空字节)


函数snprintf()和vsnprintf()的写入长度不超过大小字节(包括终止的空字节('\0'))。如果由于此限制而截断了输出,则返回值是在有足够空间的情况下写入最终字符串的字符数(不包括终止的空字节)。因此,返回值大于等于size意味着输出被截断。(另请参见下面的注释。)

如果遇到输出错误,则返回负值

因此,对于您的案例:

Maxlen>0
,在发生错误之前不会写入任何字符,
snprintf
bail

snprintf
返回一个负数。哪个负数无关紧要

Maxlen>0
,所有字符都已写入,出现某种错误,snprintf退出

snprintf
返回一个负数。哪个负数无关紧要。一个错误就是一个错误,不管在它发生之前写了多少字节

我想知道是否有更多的约定可以确定snprintf是否因为输入太多而失败

这很简单。对于错误,返回一个负数。对于截断,返回一个大于等于大小的数字。不管你是否考虑截断错误,你都要测试这两个条件和句柄。 我想知道是否有更多的约定可以确定snprintf是否因为输入太多而失败


这很简单。对于错误,返回一个负数。对于截断,返回一个大于等于大小的数字。不管你是否考虑截断错误,你都要测试这两个条件,并按照你认为合适的方式处理。

< P>这不是我读标准的方式。从n1570草案(我认为是最终免费的):

snprintf函数返回将包含的字符数 所写的n足够大,不包括 终止空字符,或在编码错误时终止负值 发生。因此,已完全写入以null结尾的输出 当且仅当返回值为非负且小于n时

他们的原型是:

int sprintf(char * restrict s, const char * restrict format, ...);
…所以他们的“n”大概是你的“Maxlen”值

所以,没问题。如果出现错误,则得到-42或其他任意负数。如果不是,则获得要写入的所有数据的长度。fit部分被写入缓冲区,如果返回值大于或等于
n
,则会发生截断

Th
int foo( char * b, size_t bLen ) {
  size_t sLen = 0;
  for(int i = 0; i < 1000; i++) {
    int res = snprintf(&b[sLen], bLen - sLen, "%d. A string ", sLen);
    // sLen:         Inc by +ive res,      (upto safe maximum)        
    sLen = std::min( sLen + (res>0?res:0), (bLen?bLen-1:bLen) );
  }
  return sLen;
}