C 문자열 취급
C string handlingC 표준 라이브러리 (libc) |
---|
일반주제 |
기타 머리글 |
C 프로그래밍 언어는 문자열(문자열과 바이트열)에 대한 연산을 구현하는 함수들의 집합을 표준 라이브러리에 가지고 있습니다.복사, 연결, 토큰화, 검색 등 다양한 작업이 지원됩니다.문자열의 경우, 표준 라이브러리는 문자열이 null-terminal이라는 규칙을 사용합니다. n개의 문자로 이루어진 문자열은 n + 1개의 요소의 배열로 표시되며, 그 중 마지막은 숫자 값이 0인 "NUL 문자"입니다.
프로그래밍 언어의 고유한 문자열에 대한 유일한 지원은 컴파일러가 인용된 문자열 상수를 null-terminated 문자열로 변환하는 것입니다.
정의들
문자열은 첫 번째 제로 코드 단위(흔히 NUL 코드 [1]단위라고 함)에 의해 종료되는 코드 단위의 연속된 시퀀스로 정의됩니다.이것은 문자열이 0 코드 단위를 포함할 수 없다는 것을 의미합니다. 처음에 보이는 것은 문자열의 끝을 표시하기 때문입니다.문자열의 길이는 0 코드 [1]단위 이전의 코드 단위 개수입니다.제로 터미네이터를 저장하기 위한 공간이 필요하기 때문에 문자열이 차지하는 메모리는 항상 길이보다 하나의 코드 단위가 더 많습니다.
일반적으로 문자열이라는 용어는 코드 단위가 유형인 문자열을 의미합니다.char
, 모든 현대 기계에서 정확히 8비트입니다.C90은 코드 단위의 타입을 사용하는 넓은[1] 문자열을 정의합니다.wchar_t
, 현대 기계에서는 16비트나 32비트입니다.이것은 유니코드를 위한 것이었지만 유니코드를 위한 일반 문자열에서 UTF-8을 사용하는 것이 점점 더 일반화되고 있습니다.
문자열은 첫 번째 코드 단위로 포인터를 전달하여 함수에 전달됩니다.부터char*
그리고.wchar_t*
는 다른 타입이고, 넓은 문자열을 처리하는 함수는 일반 문자열을 처리하는 함수와 다르고 이름도 다릅니다.
문자열 리터럴("text"
C source code)에서 [2]컴파일하는 동안 배열로 변환됩니다.결과는 모든 문자와 후행 0 코드 단위를 포함하는 코드 단위 배열입니다.인 C90L"text"
넓은 문자열을 생성합니다.문자열 리터럴에는 0 코드 단위가 포함될 수 있습니다(한 가지 방법은 다음과 같습니다).\0
source)에 입력합니다. 하지만 이렇게 하면 해당 지점에서 문자열이 종료됩니다.리터럴의 나머지 부분은 메모리에 배치되지만(끝에 다른 0 코드 단위가 추가됨) 해당 코드 단위가 문자열 리터럴에서 변환되었다는 것을 알 수 없으므로 이러한 소스 코드는 문자열 [3]리터럴이 아닙니다.
문자 부호화
각 문자열은 해당 종류의 제로 코드 단위가 처음 발생할 때 끝납니다 (char
아니면wchar_t
). 결과적으로 바이트 문자열(char*
)는 ASCII 또는 ASCII 확장자에 NUL이 아닌 문자를 포함할 수 있지만 UTF-16과 같은 인코딩에는 포함되지 않습니다(16비트 코드 단위는 0이 아닐 수 있지만 높은 바이트 또는 낮은 바이트가 0일 수 있음).넓은 문자열로 저장할 수 있는 인코딩은 다음의 너비에 의해 정의됩니다.wchar_t
. 대부분의 구현에서,wchar_t
적어도 16비트이므로 UCS-2와 같은 모든 16비트 인코딩을 저장할 수 있습니다.wchar_t
는 32비트이며 UTF-32와 같은 32비트 인코딩을 저장할 수 있습니다.(이 표준에는 "폭이 넓은 문자를 유지하는 유형"이 필요한데, 이 유형은 윈도우에서 UCS-2에서 UTF-16으로 이동한 이후로 더 이상 해당되지 않습니다.이는 규격상의 불량으로 인정되어 C++)[4]로 고정하였습니다. C++11, C11은 명시적인 폭을 가진 두 종류를 추가합니다.char16_t
그리고.char32_t
.[5]
가변 너비 인코딩은 바이트 문자열과 와이드 문자열 모두에서 사용할 수 있습니다.문자열 길이 및 오프셋은 바이트 단위로 측정됩니다.wchar_t
, 프로그래머를 시작하는 데 혼란을 줄 수 있는 "프로그래머"에는 없습니다.UTF-8과 Shift JIS는 종종 C 바이트 문자열에 사용되고 UTF-16은 종종 C 와이드 문자열에 사용됩니다.wchar_t
16비트 입니다.다음과 같은 함수를 사용하여 가변 너비 문자로 문자열 잘라내기strncpy
문자열 끝에 잘못된 시퀀스를 생성할 수 있습니다.잘린 부분을 입력이 유효하다고 가정하는 코드로 해석하는 경우 이는 안전하지 않을 수 있습니다.
다음과 같은 유니코드 리터럴 지원char foo[512] = "φωωβαρ";
(UTF-8) 또는wchar_t foo[512] = L"φωωβαρ";
(UTF-16 또는 UTF-32, 다음에 따라 다름)wchar_t
)는 구현이 [6]정의되어 있으며, 소스 코드가 동일한 인코딩일 것을 요구할 수 있습니다.char
컴파일러들이 인용문 사이에 있는 것은 무엇이든 복사할 수 있습니다.일부 컴파일러 또는 편집기에서는 ASC가 아닌 모든 파일을 입력해야 합니다.II 등장인물:\xNN
UTF-8의 각 바이트별 시퀀스 및/또는\uNNNN
UTF-16의 각 단어에 대해.C11(및 C++11) 이후로 새로운 문자 접두사u8
에서와 같이 바이트 문자열 리터럴에 대해 UTF-8을 보장하는 사용 가능합니다.char foo[512] = u8"φωωβαρ";
.[7]C[7]++20 및 C23 이후, achar8_t
UTF-8 문자를 저장하기 위한 유형이 추가되었고 u8 접두사 문자와 문자열 리터럴의 유형이 다음으로 변경되었습니다.char8_t
그리고.char8_t[]
각각 다음과 같다.
특징들
용어.
역사적 문서에서 C 문자열에 "바이트" 대신 "문자"라는 용어가 자주 사용되었는데, 이 때문에 많은 사람들이 UTF-8에서는 이러한 함수가 어떻게든 작동하지 않는다고 믿게 되었습니다[who?]. 사실 모든 길이는 바이트 단위로 정의되며 이는 모든 구현에서 사실이며, 이러한 함수는 단일 바이트 인코딩과 마찬가지로 UTF-8에서도 작동합니다.BSD 문서는 이를 명확히 하기 위해 수정되었지만 POSIX, Linux 및 Windows 문서에서는 여전히 "byte" 또는 "wchar_t"가 올바른 용어인 경우 "char"를 사용합니다.
메모리 버퍼를 처리하기 위한 함수는 널 바이트를 데이터의 일부로 포함하는 바이트 시퀀스를 처리할 수 있습니다.이러한 함수의 이름은 일반적으로 다음과 같이 시작합니다.mem
, 과는 반대로str
접두사를 붙입니다
머리글
C 문자열에서 작동하는 대부분의 함수는 에서 선언됩니다.string.h
머리글()cstring
C++)에서 C wide string에서 작동하는 함수는 에서 선언됩니다.wchar.h
머리글()cwchar
C++)에서.이러한 헤더에는 메모리 버퍼를 처리하는 데 사용되는 함수에 대한 선언도 포함되어 있으므로 이름이 잘못된 이름입니다.
에서 선언된 함수string.h
C 표준 라이브러리의 일부로서 C를 지원하는 모든 플랫폼에서 작동하는 것이 보장되기 때문에 매우 인기가 있습니다.그러나 이러한 기능에는 주의 깊고 적절하게 사용하지 않을 때 잠재적인 버퍼 오버플로와 같은 보안 문제가 있으며, 이로 인해 프로그래머들이 더 안전하고 덜 휴대할 수 있는 변형을 선호하게 됩니다. 이 중 인기 있는 변형은 아래에 나열되어 있습니다.이러한 기능 중 일부는 또한 a를 수용함으로써 상수 보정을 위반합니다.const
문자열 포인터 및 반환 -const
문자열 내의 포인터.이를 수정하기 위해 C++ 버전의 표준 라이브러리에서 일부 기능을 오버로드한 두 개의 함수로 분리했습니다.
상수 및 유형
이름. | 메모들 |
---|---|
NULL | Null 포인터 상수로 확장되는 매크로, 즉 메모리에 있는 개체의 유효한 주소가 아닐 것으로 보장되는 포인터 값을 나타내는 상수입니다. |
wchar_t | "wide" 문자열의 코드 단위에 사용되는 형식입니다.wchar_t를 광범위하게 사용할 수 있는 유일한 플랫폼인 윈도우에서, 그것은 유니코드(UCS-2) 문자를 표현하기에 충분한 16비트로[8] 정의되지만, 이제는 코드 포인트의 절반이 될 수 있는 UTF-16 코드 유닛을 표현하기에 충분합니다.다른 플랫폼에서는 32비트로 정의되며 유니코드 코드 포인트가 항상 들어맞습니다.C 표준에서는 wchar_t가 지원되는 시스템[9] 로케일 중에서 가장 넓은 문자 집합을 보유할 수 있을 정도로 충분히 넓고 [10]char와 같거나 큰 크기여야 합니다. |
wint_t | 매크로 WEOF의 값뿐만 아니라 wchar_t의 값을 포함할 수 있는 정수 유형입니다.이 유형은 통합 프로모션에 의해 변경되지 않습니다.보통 32비트 부호가 있는 값입니다. |
char8_t[11] | C23 이후 C 표준의 일부로, <uchar.h>에서 UTF-8 [12]문자를 저장하기에 적합한 유형입니다. |
char16_t[13] | C11 [14]이후 C 표준의 일부로, <uchar.h>에서 wchar_t가 다른 크기일지라도 16비트를 유지할 수 있는 유형입니다.만약 매크로__STDC_UTF_16__ 1로 정의되며, 유형은 해당 시스템의 UTF-16에 사용됩니다.이것은 [15]C23에서 항상 해당됩니다.C++는 이러한 매크로를 정의하지 않지만 해당 [16]언어의 UTF-16에는 항상 유형이 사용됩니다. |
char32_t[13] | C11 [17]이후 C 표준의 일부로, <uchar.h>에서 wchar_t가 다른 크기일지라도 32비트를 유지할 수 있는 유형입니다.만약 매크로__STDC_UTF_32__ 1로 정의되며, 유형은 해당 시스템의 UTF-32에 사용됩니다.이것은 C23에서 항상 해당됩니다.[15] C++는 이러한 매크로를 정의하지 않지만 해당 언어의 [16]UTF-32에는 항상 유형이 사용됩니다. |
mbstate_t | 한 호출에서 다른 호출로 변환하는 데 필요한 변환 상태에 대한 모든 정보를 포함합니다. |
기능들
바이트 끈을 | 넓은 끈을 | 설명[note 1] | |
---|---|---|---|
끈 조작. | 스트릭파이[18] | wcscpy[19] | 한 문자열을 다른 문자열로 복사합니다. |
견실한[20] | wcsncpy[21] | 정확히 n바이트를 쓰거나 원본에서 복사하거나 null을 추가합니다. | |
스트랫캣[22] | wcscat[23] | 하나의 문자열을 다른 문자열에 추가합니다. | |
스트렝캣[24] | wcsncat[25] | 문자열 간에 n바이트 이하를 추가합니다. | |
strxfrm[26] | wcsxfrm[27] | 현재 로케일에 따라 문자열을 변환합니다. | |
끈 검토. | 으스스한[28] | wcslen[29] | 문자열의 길이를 반환합니다. |
strcmmp[30] | wcscmp[31] | 두 문자열을 비교합니다(삼원 비교). | |
strnmp[32] | wcsncmp[33] | 두 문자열의 특정 바이트 수를 비교합니다. | |
strcoll[34] | wcscoll[35] | 현재 로케일에 따라 두 문자열을 비교합니다. | |
성큼성큼한[36] | wcschr[37] | 문자열에서 바이트가 처음으로 발생하는 경우를 찾습니다. | |
으르렁거리는[38] | wcsrchr[39] | 문자열에서 바이트의 마지막 항목을 찾습니다. | |
strspn[40] | wcsspn[41] | 두 번째 문자열에 있는 문자열의 초기 바이트 수를 반환합니다. | |
strcspn[42] | wcscspn[43] | 두 번째 문자열에 없는 문자열의 초기 바이트 수를 반환합니다. | |
strpbrk[44] | wcspbrk[45] | 문자열에서 집합에서 바이트의 첫 번째 항목을 찾습니다. | |
strstr[46] | wcsstr[47] | 문자열에서 부분 문자열이 처음으로 나타나는 경우를 찾습니다. | |
스트럭토크[48] | wcstock[49] | 문자열을 토큰으로 분할합니다. | |
여러가지 종류의 | 공포의[50] | — | 오류 코드에서 파생된 메시지를 포함하는 문자열을 반환합니다. |
기억 조작. | 멤셋[51] | wmemset[52] | 버퍼를 반복되는 바이트로 채웁니다.C23부터 memset_explicit()을 추가하여 민감한 데이터를 지웠습니다. |
멤피[53] | wmemcpy[54] | 한 버퍼를 다른 버퍼에 복사합니다.C23부터는 문자열을 효율적으로 연결하기 위해 memccpy()를 추가했습니다. | |
미모프[55] | wemmove[56] | 하나의 버퍼를 다른 버퍼(중복 가능)에 복사 | |
memcmp[57] | wmemcmp[58] | 두 버퍼를 비교합니다(삼원 비교). | |
memchr[59] | wmemchr[60] | 버퍼에서 바이트가 처음으로 발생하는 경우를 찾습니다. | |
|
멀티바이트 기능
이름. | 묘사 |
---|---|
맥블렌의[61] | 다음 멀티바이트 문자의 바이트 수를 반환합니다. |
mbtowc[62] | 다음 멀티바이트 문자를 와이드 문자로 변환 |
wtomb[63] | 와이드 문자를 멀티바이트 표현으로 변환 |
mbstowcs[64] | 멀티바이트 문자열을 넓은 문자열로 변환합니다. |
wcstombs[65] | 넓은 문자열을 멀티바이트 문자열로 변환합니다. |
btowc[66] | 가능한 경우 단일 바이트 문자를 와이드 문자로 변환합니다. |
wctob[67] | 가능한 경우 넓은 문자를 단일 바이트 문자로 변환합니다. |
mbs init[68] | 상태 개체가 초기 상태를 나타내는지 확인합니다. |
엠블렌의[69] | 주어진 상태에서 다음 멀티바이트 문자의 바이트 수를 반환합니다. |
mbr towc[70] | 다음 멀티바이트 문자를 주어진 상태의 넓은 문자로 변환합니다. |
wcr 무덤[71] | 넓은 문자를 주어진 상태에서 멀티바이트 표현으로 변환합니다. |
mbsrtows[72] | 멀티바이트 문자열을 주어진 넓은 문자열로 변환합니다. |
wcsrtombs[73] | 주어진 상태에서 넓은 문자열을 멀티바이트 문자열로 변환합니다. |
mbrtoc8[74] | 다음 멀티바이트 문자를 주어진 상태에서 UTF-8 문자로 변환합니다. |
c8 rtomb[75] | UTF-8의 단일 코드 포인트를 주어진 상태에서 좁은 멀티바이트 문자 표현으로 변환합니다. |
mbrtoc16[76] | 다음 멀티바이트 문자를 주어진 상태에서 UTF-16 문자로 변환합니다. |
c16rtomb[77] | UTF-16의 단일 코드 포인트를 주어진 상태에서 좁은 멀티바이트 문자 표현으로 변환합니다. |
mbrtoc32[78] | 다음 멀티바이트 문자를 주어진 상태에서 UTF-32 문자로 변환합니다. |
c32 rtomb[79] | UTF-32의 단일 코드 포인트를 주어진 상태에서 좁은 멀티바이트 문자 표현으로 변환합니다. |
이 기능들은 모두 원래 정적 메모리(기능이 스레드에 안전하지 않도록 함)에 있는 개체를 필요로 하며 나중에 추가로 호출자가 유지 관리해야 합니다.이것은 원래 인코딩에서 시프트 상태를 추적하기 위한 것이었지만 UTF-8과 같은 현대적인 것은 이것이 필요하지 않습니다.그러나 이러한 함수는 인코딩이 가변 너비 인코딩이 아니므로 한 번에 하나씩만 처리하도록 설계되었으며 문자열 포인터를 사용하는 대신 값으로 전달했습니다.UTF-16이 가변 너비 인코딩이기 때문에 이는 넓은 인코딩에서 대리 쌍을 추적하기 위해 재사용되었지만 호출자는 여전히 단일 [80][81][82]문자를 탐지하고 두 번 호출해야 합니다.나중에 표준에 추가된 것들은 UTF-8과 UTF-16 사이의 변환 프로그래머들이 관심이 있다는 것을 인정하고 직접적으로 이것을 제공합니다.
숫자 변환
바이트 끈을 | 넓은 끈을 | 설명[note 1] |
---|---|---|
의 경우에[83] | — | 문자열을 부동 소수점 값으로 변환합니다('atof'는 '떠있는 ASCII'를 의미함). |
아토이 외상값 환초[84] | — | 문자열을 정수(C99)로 변환합니다('atoi'는 'ASCII에서 정수'를 의미함). |
띠 (C99)[85] 스트릿 스트릿[86] strtold (C99)[87] | wcstof (C99)[88] wcstod[89] wcstold (C99)[90] | 문자열을 부동 소수점 값으로 변환합니다. |
스트롤트 스트롤 톨[91] | wcstol wcstroll[92] | 문자열을 부호 있는 정수로 변환합니다. |
거드름피우다 울퉁불퉁한[93] | wcstoul wcstoul[94] | 문자열을 부호 없는 정수로 변환합니다. |
|
C 표준 라이브러리에는 숫자 변환을 위한 몇 가지 기능이 포함되어 있습니다.바이트 문자열을 처리하는 함수는 에서 정의됩니다.stdlib.h
머리글()cstdlib
헤더를 C++)에 입력합니다.넓은 문자열을 처리하는 함수는 다음에 정의됩니다.wchar.h
머리글()cwchar
헤더를 C++)에 입력합니다.
그 기능들은strchr
,bsearch
,strpbrk
,strrchr
,strstr
,memchr
그리고 그들의 넓은 대응물은 그들이 a를 받아들이기 때문에 항상 정확하지 않습니다.const
문자열 포인터를 반환하고 non-without을 반환합니다.const
문자열 내의 포인터.이것은 [95]C23에서 고쳐졌습니다.
또한 규범개정 1(C95)이후,atoxx
함수는 다음과 같이 포섭됩니다.strtoxxx
함수들은 이러한 함수들의 넓은 문자 버전들을 제공하지 않기 때문에 C95나 그 이후의 표준들은 제공하지 않습니다.에 대한 논쟁.atoxx
그들이 오류와 a를 구별하지 않는다는 것입니다.0
.[96]
인기 확장자
이름. | 플랫폼 | 묘사 |
---|---|---|
bzero[97][98] | POSIX, BSD | 버퍼를 0바이트로 채우며, memset에서 사용하지 않습니다. |
memccpy[99] | SVID, POSIX | C23 이후 C 표준의 일부는 중복되지 않는 두 메모리 영역 사이에 복사되며, 주어진 바이트가 발견되면 중지됩니다. |
멤피[100] | GNU | 마지막으로 쓴 바이트 뒤에 포인터를 바이트로 되돌리는 memcpy 변형 |
strcase cmp[101] | POSIX, BSD | strcmp의 대소문자를 구분하지 않음 |
strcat_s[102] | 창문들 | 복사하기 전에 대상 버퍼 크기를 확인하는 strcat의 변형 |
strcpy_s[103] | 창문들 | 복사하기 전에 대상 버퍼 크기를 확인하는 strcpy 변형 |
힘을 보태다[104] | 포식스 | C23 이후 C 표준의 일부로 문자열을 할당하고 복제합니다. |
streerror_r[105] | POSIX 1, GNU | 실에 안전한 공포의 변종GNU 버전은 POSIX 버전과 호환되지 않습니다. |
상투적인[106] | 창문들 | strcmp의 대소문자를 구분하지 않음 |
스트럭피[107] | BSD, Solaris | 결과를[108] 대상 버퍼에 맞게 잘라내는 strcpy의 변형 |
스트렐캣[107] | BSD, Solaris | 결과를[108] 대상 버퍼에 맞게 잘라내는 strcat의 변형 |
스트라시그널[109] | POSIX:2008 | 신호 코드의 문자열 표현을 반환합니다.실이 안전하지 않습니다. |
strtok_r[110] | 포식스 | 실에 안전한 스트록의 변형 |
교체품
대체할 필요성이 충분히 확립되어 있음에도 불구하고strcat
[22] 그리고strcpy
[18] 버퍼 오버플로를 허용하지 않는 함수의 경우 허용된 표준이 발생하지 않았습니다.이것은 부분적으로 많은 C 프로그래머들에 의한 잘못된 믿음 때문입니다.strncat
그리고.strncpy
그러나 두 함수 모두 이를 위해 설계되지 않았으며(현대 소프트웨어에서 덜 일반적으로 사용되는 데이터 형식인 null-signed fixed-size string buffer를 조작하기 위한 것이었습니다), 동작과 인수는 비논리적이며 전문 [108]프로그래머에 의해서도 종종 부정확하게 작성됩니다.
가장[a] 인기있는 대체품은strlcat
그리고.strlcpy
1998년 [108]12월 OpenBSD 2.4에 등장한 함수.이러한 함수는 항상 하나의 NUL을 대상 버퍼에 기록하고 필요한 경우 결과를 잘라내며 필요한 버퍼 크기를 반환합니다. 이를 통해 잘라내기를 탐지할 수 있고 잘라내지 않는 새 버퍼를 생성하기 위한 크기를 제공합니다.그들은 [111]비효율적이라고 주장되고, (어떤 우월한 대체 [112][113]형태의 문자열 대신) C 문자열의 사용을 장려하고, 다른 잠재적인 [114][115]오류를 숨기고 있다는 근거로 비판을 받아왔습니다.따라서 OpenBSD, FreeBSD, NetBSD, Solaris, OS X 및 QNX용 C 라이브러리와 [116]2008년에 도입된 libbsd 및 [117][118]2011년에 도입된 musl과 같은 리눅스용 대체 C 라이브러리에 구현되었지만 (Linux의 소프트웨어에서 사용되는) GNU C 라이브러리에는 포함되지 않았습니다.GNUC 라이브러리 지원 부족으로 인해 다양한 소프트웨어 작성자들이 SDL, GLib, fmpeg, rsync, 그리고 내부적으로 리눅스 커널에서 이 라이브러리를 사용하고 대체품을 번들로 제공하는 것을 막지 못했습니다.이러한 기능에 대한 오픈 소스 구현을 사용할 [119][120]수 있습니다.
가끔씩memcpy
[53] 아니면memmove
[55] 보다 더 효율적일 수 있기 때문에 사용됩니다.strcpy
NUL을 반복적으로 확인하지 않기 때문입니다(현대 프로세서에서는 덜 해당됨).매개 변수로 버퍼 길이가 필요하므로 이 매개 변수를 올바르게 설정하면 버퍼 오버플로를 방지할 수 있습니다.
2004년 보안 개발 라이프사이클의 일환으로 마이크로소프트는 다음과 같은 "보안" 기능 제품군을 선보였습니다.strcpy_s
그리고.strcat_s
(다른 [121]많은 것들과 함께).이러한 기능들은 ISO/IEC WDTR 24731에 의해 제안된 선택적 C11(Annex K)의 일부로서 약간의 변경과 함께 표준화되었습니다.이 함수들은 문자열이 버퍼에 맞추기에 너무 긴지 여부를 포함한 다양한 검사를 수행합니다.검사가 실패하면 사용자가 지정한 "runtime-constraint handler" 함수가 [122]호출되며,[123][124] 이 함수는 일반적으로 프로그램을 중단합니다.일부 함수는 런타임 제약 처리기를 호출하기 전에 파괴 연산을 수행합니다.strcat_s
는 대상을 빈 [125]문자열로 설정하므로 오류 상태를 복구하거나 디버그하기가 어려울 수 있습니다.이러한 기능들은 처음에는 윈도우에서만 구현되었고 동시에 마이크로소프트 비주얼 C++에 의해 표준 기능 대신 이러한 기능을 사용할 것을 제안하는 경고 메시지가 생성되기 시작했기 때문에 상당한 비판을 받았습니다.이는 마이크로소프트가 개발자들을 자사 [126]플랫폼에 가두기 위한 시도로 추측되고 있습니다.이러한 기능의 오픈 소스 구현은 사용할 수 있지만 일반적인 유닉스 [127]C 라이브러리에는 이러한 기능이 없습니다.이러한 기능에 대한 경험으로 채택에 상당한 문제와 사용상의 오류가 발생하고 있으므로, 부속서 K의 제거는 다음 C [128]표준 개정을 위해 제안됩니다.용도memset_s
원치 않는 컴파일러 [129][130]최적화를 피할 수 있는 방법으로 제안되기도 했습니다.
참고 항목
- C 구문 § 문자열 – 백슬래시 이스케이프 시퀀스를 포함한 소스 코드 구문
- 문자열 함수
- Perl 호환 정규식(PCRE)
메모들
- ^ 깃허브에는 7,813,206개의 사용처가 있습니다.
strlcpy
, 38,644의 사용 대비strcpy_s
(및 15,286,150 사용)strcpy
).[citation needed]
참고문헌
- ^ a b c "The C99 standard draft + TC3" (PDF). §7.1.1p1. Retrieved 7 January 2011.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ "The C99 standard draft + TC3" (PDF). §6.4.5p7. Retrieved 7 January 2011.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ "The C99 standard draft + TC3" (PDF). Section 6.4.5 footnote 66. Retrieved 7 January 2011.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ "Relax requirements on wchar_t to match existing practices" (PDF).
- ^ "Fundamental types". en.cppreference.com.
- ^ "The C99 standard draft + TC3" (PDF). §5.1.1.2 Translation phases, p1. Retrieved 23 December 2011.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ "string literals". en.cppreference.com. Retrieved 23 December 2019.
- ^ "c++ - What is the use of wchar_t in general programming?". Stack Overflow. Retrieved 1 August 2022.
- ^ "stddef.h - standard type definitions". The Open Group. Retrieved 28 January 2017.
- ^ Gillam, Richard (2003). Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard. Addison-Wesley Professional. p. 714. ISBN 9780201700527.
- ^ "char, wchar_t, char8_t, char16_t, char32_t". docs.microsoft.com. Retrieved 1 August 2022.
- ^ "char8_t".
- ^ a b "<cuchar> (uchar.h)".
- ^ "char16_t".
- ^ a b "Replacing text macros".
- ^ a b "Fundamental types".
- ^ "char32_t".
- ^ a b "strcpy - cppreference.com". En.cppreference.com. 2 January 2014. Retrieved 6 March 2014.
- ^ "wcscpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strncpy - cppreference.com". En.cppreference.com. 4 October 2013. Retrieved 6 March 2014.
- ^ "wcsncpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ a b "strcat - cppreference.com". En.cppreference.com. 8 October 2013. Retrieved 6 March 2014.
- ^ "wcscat - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strncat - cppreference.com". En.cppreference.com. 1 July 2013. Retrieved 6 March 2014.
- ^ "wcsncat - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strxfrm - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcsxfrm - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strlen - cppreference.com". En.cppreference.com. 27 December 2013. Retrieved 6 March 2014.
- ^ "wcslen - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strcmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcscmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strncmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcsncmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strcoll - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcscoll - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strchr - cppreference.com". En.cppreference.com. 23 February 2014. Retrieved 6 March 2014.
- ^ "wcschr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strrchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcsrchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strspn - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcsspn - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strcspn - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
- ^ "wcscspn - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strpbrk - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
- ^ "wcspbrk - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strstr - cppreference.com". En.cppreference.com. 16 October 2013. Retrieved 6 March 2014.
- ^ "wcsstr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strtok - cppreference.com". En.cppreference.com. 3 September 2013. Retrieved 6 March 2014.
- ^ "wcstok - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strerror - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
- ^ "memset - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wmemset - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ a b "memcpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wmemcpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ a b "memmove - cppreference.com". En.cppreference.com. 25 January 2014. Retrieved 6 March 2014.
- ^ "wmemmove - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "memcmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wmemcmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "memchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wmemchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mblen - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mbtowc - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wctomb - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
- ^ "mbstowcs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcstombs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "btowc - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wctob - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mbsinit - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mbrlen - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mbrtowc - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcrtomb - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mbsrtowcs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcsrtombs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "mbrtoc8 - cppreference.com". En.cppreference.com.
- ^ "c8rtomb - cppreference.com". En.cppreference.com.
- ^ "mbrtoc16 - cppreference.com". En.cppreference.com.
- ^ "c16rtomb - cppreference.com". En.cppreference.com.
- ^ "mbrtoc32 - cppreference.com". En.cppreference.com.
- ^ "c23rtomb - cppreference.com". En.cppreference.com.
- ^ "6.3.2 Representing the state of the conversion". The GNU C Library. Retrieved 31 January 2017.
- ^ "root/src/multibyte/c16rtomb.c". Retrieved 31 January 2017.
- ^ "Contents of /stable/11/lib/libc/locale/c16rtomb.c". Retrieved 31 January 2017.
- ^ "atof - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
- ^ "atoi, atol, atoll - cppreference.com". En.cppreference.com. 18 January 2014. Retrieved 6 March 2014.
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
- ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
- ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
- ^ "WG14-N3020 : Qualifier-preserving standard library functions, v4" (PDF). open-std.org. 13 June 2022.
- ^ C99 근거, 7.20.1.1
- ^ "bzero". The Open Group. Retrieved 27 November 2017.
- ^ "bzero(3)". OpenBSD. Retrieved 27 November 2017.
- ^ "memccpy". Pubs.opengroup.org. Retrieved 6 March 2014.
- ^ "mempcpy(3) - Linux manual page". Kernel.org. Retrieved 6 March 2014.
- ^ "strcasecmp(3) - Linux manual page". Kernel.org. Retrieved 6 March 2014.
- ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com. Retrieved 22 April 2022.
- ^ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l". docs.microsoft.com. Retrieved 22 April 2022.
- ^ "strdup". Pubs.opengroup.org. Retrieved 6 March 2014.
- ^ "strerror(3) - Linux manual page". man7.org. Retrieved 3 November 2019.
- ^ "String stricmp()". C Programming Expert.com. Retrieved 6 March 2014.
- ^ a b "strlcpy, strlcat — size-bounded string copying and concatenation". OpenBSD. Retrieved 26 May 2016.
- ^ a b c d Todd C. Miller; Theo de Raadt (1999). "strlcpy and strlcat – consistent, safe, string copy and concatenation". USENIX '99.
- ^ "strsignal". Pubs.opengroup.org. Retrieved 6 March 2014.
- ^ "strtok". Pubs.opengroup.org. Retrieved 6 March 2014.
- ^ Miller, Damien (October 2005). "Secure Portability" (PDF). Retrieved 26 June 2016.
This [strlcpy and strlcat] API has been adopted by most modern operating systems and many standalone software packages [...]. The notable exception is the GNU standard C library, glibc, whose maintainer steadfastly refuses to include these improved APIs, labelling them "horribly inefficient BSD crap", despite prior evidence that they are faster is most cases than the APIs they replace.
- ^ libc-alpha 메일링 리스트, 2000년 8월 8일부터 선택된 메시지: 53, 60, 61
- ^ strlcpy의 우여곡절; LWN.net
- ^ "Adding strlcpy() to glibc". lwn.net.
Correct string handling means that you always know how long your strings are and therefore you can you memcpy (instead of strcpy).
- ^ – 리눅스 라이브러리 기능 매뉴얼 "그러나 strlcpy()와 strlcat()의 전체 목적을 무시하기 때문에 이러한 최적화의 타당성에 의문을 제기할 수 있습니다.사실, 이 매뉴얼 페이지의 첫 번째 버전은 틀렸습니다."
- ^ "libbsd". Retrieved 21 November 2022.
- ^ "root/src/string/strlcpy.c". Retrieved 28 January 2017.
- ^ "root/src/string/strlcat.c". Retrieved 28 January 2017.
- ^ Todd C. Miller. "strlcpy.c". BSD Cross Reference.
- ^ Todd C. Miller. "strlcat.c". BSD Cross Reference.
- ^ Lovell, Martyn. "Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries". Retrieved 13 February 2015.
- ^ "The C11 standard draft" (PDF). §K.3.1.4p2. Retrieved 13 February 2013.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ "The C11 standard draft" (PDF). §K.3.6.1.1p4. Retrieved 13 February 2013.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ "Parameter Validation".
- ^ "The C11 standard draft" (PDF). §K.3.7.2.1p4. Retrieved 13 February 2013.
{{cite web}}
: CS1 메인 : 위치 (링크) - ^ Danny Kalev. "They're at it again". InformIT. Archived from the original on 15 January 2012. Retrieved 10 November 2011.
- ^ Safe C Library. "The Safe C Library provides bound checking memory and string functions per ISO/IEC TR24731". Sourceforge. Retrieved 6 March 2013.
- ^ "Field Experience With Annex K — Bounds Checking Interfaces". Retrieved 5 November 2015.
- ^ "MSC06-C. Beware of compiler optimizations". SEI CERT C Coding Standard.
- ^ – FreeBSD 라이브러리 기능 매뉴얼
외부 링크
