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