snprintf
полезно, так как вы можете выделить больший буфер, а затем повторить попытку, или вы вызываете его в следующей последовательности:
// cons lists as [a,b,c, ...]
if ( type == kin_cons_class() ) {
size_t offs = snprintf ( buf, max, "[" );
if ( offs >= max )
return nul_terminate ( buf, offs, max );
size_t count = depth;
kin_cons_ref_t empty = kin_cons_nil();
kin_cons_ref_t cons;
for ( cons = ref; cons != empty; cons = kin_cons_tail ( cons ) ) {
if ( count > 15 ) {
offs += snprintf ( buf + offs, max - offs, ", ..." );
break;
}
if ( cons != ref ) {
offs += snprintf ( buf + offs, max - offs, "," );
if ( offs >= max )
return nul_terminate ( buf, offs, max );
}
offs += string_repr ( buf + offs, max - offs, kin_cons_head ( cons ), depth, escape_strings );
if ( offs >= max )
return nul_terminate ( buf, offs, max );
++count;
}
if ( offs >= max )
return nul_terminate ( buf, offs, max );
offs += snprintf ( buf + offs, max - offs, "]" );
return nul_terminate ( buf, offs, max );
}
Если вы продолжите работать без всех тестов offs >= max
, вы получите переполнение буфера, и оно будет зависать.
Этого не происходит с printf
, поэтому реже проверяют возврат.
Если вам нужно изменить свое поведение в зависимости от того, работает ли функция, вы проверяете возврат. Многие стандартные библиотечные функции могут либо потерпеть неудачу, либо привести к неопределенному поведению позже, поэтому вам нужно проверить эти результаты.
Если вам не нужно изменять поведение в зависимости от возвращаемого значения, то нет смысла проверять его.