strerror, strerror_s, strerrorlen_s
From cppreference.net
|
헤더 파일에 정의됨
<string.h>
|
||
|
char
*
strerror
(
int
errnum
)
;
|
(1) | |
|
errno_t strerror_s
(
char
*
buf, rsize_t bufsz, errno_t errnum
)
;
|
(2) | (C11부터) |
|
size_t
strerrorlen_s
(
errno_t errnum
)
;
|
(3) | (C11부터) |
errnum
는 일반적으로
errno
변수에서 얻어지지만, 이 함수는
int
타입의 모든 값을 받아들입니다. 문자열의 내용은 로케일별로 다릅니다.
반환된 문자열은 프로그램에 의해 수정되어서는 안 되지만, 이후
strerror
함수 호출에 의해 덮어씌워질 수 있습니다.
strerror
는 스레드 안전성을 보장하지 않습니다. 구현체는 정적 읽기 전용 문자열 리터럴에 대한 서로 다른 포인터를 반환할 수도 있고, strerror가 문자열을 저장하는 정적 버퍼를 가리키는 동일한 포인터를 반복해서 반환할 수도 있습니다.
2)
(1)
과 동일하지만, 메시지가 사용자가 제공한 저장 공간
buf
에 복사됩니다.
bufsz-1
바이트를 초과하여 기록되지 않으며, 버퍼는 항상 null로 종료됩니다. 메시지가 버퍼에 맞도록 잘라야 하고
bufsz
가 3보다 큰 경우,
bufsz-4
바이트만 기록되고 null 종결자 앞에 문자
"..."
가 추가됩니다. 또한 런타임에 다음 오류들이 감지되어 현재 설치된
constraint handler
함수를 호출합니다:
-
-
buf가 null 포인터인 경우 -
bufsz가 0이거나 RSIZE_MAX 보다 큰 경우
-
동작은 배열의 끝을 넘어서
buf
에 쓰기가 발생할 경우 정의되지 않으며, 이는
buf
가 가리키는 버퍼의 크기가 오류 메시지의 문자 수보다 작고, 이 문자 수가 다시
bufsz
보다 작을 때 발생할 수 있습니다.
3)
strerror_s
가
errnum
으로 호출되었을 때 작성할 로케일별 오류 메시지의 잘리지 않은 길이를 계산합니다. 길이는 널 종결자를 포함하지 않습니다.
-
모든 경계 검사 함수와 마찬가지로,
strerror_s와strerrorlen_s는 구현에서 __STDC_LIB_EXT1__ 가 정의되고 사용자가 <string.h> 를 포함하기 전에 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 로 정의한 경우에만 사용 가능함이 보장됩니다.
목차 |
매개변수
| errnum | - | 오류 코드를 참조하는 정수 값 |
| buf | - | 사용자가 제공한 버퍼에 대한 포인터 |
| bufsz | - | 사용자가 제공한 버퍼의 크기 |
반환값
2)
전체 메시지가
buf
에 성공적으로 저장된 경우 0, 그렇지 않은 경우 0이 아닌 값.
3)
strerror_s
가 반환할 메시지의 길이(null 종결자 제외)
참고 사항
POSIX
는 이후의
strerror
호출이 이전 호출에서 반환된 포인터 값을 무효화할 수 있도록 허용합니다. 또한 이러한 메시지의 내용을 제어하는 것은
LC_MESSAGES
로캘 패싯으로 규정하고 있습니다.
strerror_s
는 잘림을 허용하는 유일한 범위 검사 함수입니다. 왜냐하면 실패에 대한 가능한 많은 정보를 제공하는 것이 더 바람직하다고 판단되었기 때문입니다. POSIX는 유사한 목적으로
strerror_r
도 정의합니다.
예제
이 코드 실행
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <errno.h> #include <string.h> #include <locale.h> int main(void) { FILE *fp = fopen(tmpnam((char[L_tmpnam]){0}), "r"); if(fp==NULL) { printf("File opening error: %s\n", strerror(errno)); setlocale(LC_MESSAGES, "de_DE.utf8"); printf("Now in German: %s\n", strerror(errno)); #ifdef __STDC_LIB_EXT1__ setlocale(LC_ALL, "ja_JP.utf8"); // printf needs CTYPE for multibyte output size_t errmsglen = strerrorlen_s(errno) + 1; char errmsg[errmsglen]; strerror_s(errmsg, errmsglen, errno); printf("Now in Japanese: %s\n", errmsg); #endif } }
가능한 출력:
File opening error: No such file or directory Now in German: Datei oder Verzeichnis nicht gefunden Now in Japanese: そのようなファイル、又はディレクトリはありません
참고문헌
- C11 표준 (ISO/IEC 9899:2011):
-
- 7.24.6.2 strerror 함수 (p: 371)
-
- K.3.7.4.2 strerror_s 함수 (p: 622)
-
- K.3.7.4.3 strerrorlen_s 함수 (p: 623)