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