14

http://linux.die.net/man/3/sprintfおよびhttp://www.cplusplus.com/reference/cstdio/sprintf/ によるsprintf()と、ファミリは成功時に書き込まれた文字数を返します。失敗すると、負の値が返されます。フォーマット文字列の形式が正しくない場合にエラーが発生する可能性があるため、負の戻り値はエラー以外の何かを示す可能性があると思いmalloc()ます。errnoエラーの内容を示すように設定されていますか?

4

2 に答える 2

11

C++ は C に従い、Cは および ファミリerrnoの説明で要求も言及もしませんsprintf()(ただし、特定の形式指定子については、これらの関数は を呼び出すように定義されておりmbrtowc()、これは で設定される場合がありますEILSEQ) errno

POSIX では、errno が設定されている必要があります。

出力エラーが発生した場合、これらの関数は負の値を返し、errnoエラーを示すように設定されます。

EILSEQ、EINVAL、EBADF、ENOMEM、EOVERFLOW が明示的に言及されています: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html

于 2013-02-08T17:39:35.300 に答える
5

このような質問があるときは、いつも「試してみる」方法が好きです。

char buffer[50];
int n, localerr = 0;
n = sprintf(buffer, "%s", "hello");
localerr = errno; // ensure printf doesn't mess with the result
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));

> 5 chars
errno: 0
strerror: Success

n = sprintf(buffer, NULL, NULL);
localerr = errno;
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));

> -1 chars
errno: 22
strerror: Invalid argument

Linuxでgccでコンパイルすると設定されるようです。これは良いデータであり、そのマニュアル ページでは、 (同じファミリ と) が変更される可能性があるとerrno言及されています(下部の例で)。printf()sprintf()errno

于 2013-02-08T18:01:41.483 に答える