C 문자열 취급

C string handling

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 코드 단위가 포함될 수 있습니다(한 가지 방법은 다음과 같습니다).\0source)에 입력합니다. 하지만 이렇게 하면 해당 지점에서 문자열이 종료됩니다.리터럴의 나머지 부분은 메모리에 배치되지만(끝에 다른 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-8Shift JIS는 종종 C 바이트 문자열에 사용되고 UTF-16은 종종 C 와이드 문자열에 사용됩니다.wchar_t16비트 입니다.다음과 같은 함수를 사용하여 가변 너비 문자로 문자열 잘라내기strncpy문자열 끝에 잘못된 시퀀스를 생성할 수 있습니다.잘린 부분을 입력이 유효하다고 가정하는 코드로 해석하는 경우 이는 안전하지 않을 수 있습니다.

다음과 같은 유니코드 리터럴 지원char foo[512] = "φωωβαρ";(UTF-8) 또는wchar_t foo[512] = L"φωωβαρ";(UTF-16 또는 UTF-32, 다음에 따라 다름)wchar_t)는 구현이 [6]정의되어 있으며, 소스 코드가 동일한 인코딩일 것을 요구할 수 있습니다.char컴파일러들이 인용문 사이에 있는 것은 무엇이든 복사할 수 있습니다.일부 컴파일러 또는 편집기에서는 ASC가 아닌 모든 파일을 입력해야 합니다.II 등장인물:\xNNUTF-8의 각 바이트별 시퀀스 및/또는\uNNNNUTF-16의 각 단어에 대해.C11(및 C++11) 이후로 새로운 문자 접두사u8에서와 같이 바이트 문자열 리터럴에 대해 UTF-8을 보장하는 사용 가능합니다.char foo[512] = u8"φωωβαρ";.[7]C[7]++20C23 이후, achar8_tUTF-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머리글()cstringC++)에서 C wide string에서 작동하는 함수는 에서 선언됩니다.wchar.h머리글()cwcharC++)에서.이러한 헤더에는 메모리 버퍼를 처리하는 데 사용되는 함수에 대한 선언도 포함되어 있으므로 이름이 잘못된 이름입니다.

에서 선언된 함수string.hC 표준 라이브러리의 일부로서 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] 버퍼에서 바이트가 처음으로 발생하는 경우를 찾습니다.
  1. ^ 넓은 문자열 함수의 경우 설명에서 wchar_t를 "byte"로 대체합니다.

멀티바이트 기능

이름. 묘사
맥블렌의[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]
문자열을 부호 없는 정수로 변환합니다.
  1. ^ 여기서 문자열은 바이트 문자열 또는 넓은 문자열을 나타냅니다.

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그리고.strlcpy1998년 [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] 보다 더 효율적일 수 있기 때문에 사용됩니다.strcpyNUL을 반복적으로 확인하지 않기 때문입니다(현대 프로세서에서는 덜 해당됨).매개 변수로 버퍼 길이가 필요하므로 이 매개 변수를 올바르게 설정하면 버퍼 오버플로를 방지할 수 있습니다.

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]최적화를 피할 수 있는 방법으로 제안되기도 했습니다.

참고 항목

메모들

  1. ^ 깃허브에는 7,813,206개의 사용처가 있습니다.strlcpy, 38,644의 사용 대비strcpy_s(및 15,286,150 사용)strcpy).[citation needed]

참고문헌

  1. ^ a b c "The C99 standard draft + TC3" (PDF). §7.1.1p1. Retrieved 7 January 2011.{{cite web}}: CS1 메인 : 위치 (링크)
  2. ^ "The C99 standard draft + TC3" (PDF). §6.4.5p7. Retrieved 7 January 2011.{{cite web}}: CS1 메인 : 위치 (링크)
  3. ^ "The C99 standard draft + TC3" (PDF). Section 6.4.5 footnote 66. Retrieved 7 January 2011.{{cite web}}: CS1 메인 : 위치 (링크)
  4. ^ "Relax requirements on wchar_t to match existing practices" (PDF).
  5. ^ "Fundamental types". en.cppreference.com.
  6. ^ "The C99 standard draft + TC3" (PDF). §5.1.1.2 Translation phases, p1. Retrieved 23 December 2011.{{cite web}}: CS1 메인 : 위치 (링크)
  7. ^ "string literals". en.cppreference.com. Retrieved 23 December 2019.
  8. ^ "c++ - What is the use of wchar_t in general programming?". Stack Overflow. Retrieved 1 August 2022.
  9. ^ "stddef.h - standard type definitions". The Open Group. Retrieved 28 January 2017.
  10. ^ Gillam, Richard (2003). Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard. Addison-Wesley Professional. p. 714. ISBN 9780201700527.
  11. ^ "char, wchar_t, char8_t, char16_t, char32_t". docs.microsoft.com. Retrieved 1 August 2022.
  12. ^ "char8_t".
  13. ^ a b "<cuchar> (uchar.h)".
  14. ^ "char16_t".
  15. ^ a b "Replacing text macros".
  16. ^ a b "Fundamental types".
  17. ^ "char32_t".
  18. ^ a b "strcpy - cppreference.com". En.cppreference.com. 2 January 2014. Retrieved 6 March 2014.
  19. ^ "wcscpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  20. ^ "strncpy - cppreference.com". En.cppreference.com. 4 October 2013. Retrieved 6 March 2014.
  21. ^ "wcsncpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  22. ^ a b "strcat - cppreference.com". En.cppreference.com. 8 October 2013. Retrieved 6 March 2014.
  23. ^ "wcscat - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  24. ^ "strncat - cppreference.com". En.cppreference.com. 1 July 2013. Retrieved 6 March 2014.
  25. ^ "wcsncat - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  26. ^ "strxfrm - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  27. ^ "wcsxfrm - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  28. ^ "strlen - cppreference.com". En.cppreference.com. 27 December 2013. Retrieved 6 March 2014.
  29. ^ "wcslen - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  30. ^ "strcmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  31. ^ "wcscmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  32. ^ "strncmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  33. ^ "wcsncmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  34. ^ "strcoll - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  35. ^ "wcscoll - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  36. ^ "strchr - cppreference.com". En.cppreference.com. 23 February 2014. Retrieved 6 March 2014.
  37. ^ "wcschr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  38. ^ "strrchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  39. ^ "wcsrchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  40. ^ "strspn - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  41. ^ "wcsspn - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  42. ^ "strcspn - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
  43. ^ "wcscspn - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  44. ^ "strpbrk - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
  45. ^ "wcspbrk - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  46. ^ "strstr - cppreference.com". En.cppreference.com. 16 October 2013. Retrieved 6 March 2014.
  47. ^ "wcsstr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  48. ^ "strtok - cppreference.com". En.cppreference.com. 3 September 2013. Retrieved 6 March 2014.
  49. ^ "wcstok - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  50. ^ "strerror - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
  51. ^ "memset - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  52. ^ "wmemset - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  53. ^ a b "memcpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  54. ^ "wmemcpy - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  55. ^ a b "memmove - cppreference.com". En.cppreference.com. 25 January 2014. Retrieved 6 March 2014.
  56. ^ "wmemmove - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  57. ^ "memcmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  58. ^ "wmemcmp - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  59. ^ "memchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  60. ^ "wmemchr - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  61. ^ "mblen - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  62. ^ "mbtowc - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  63. ^ "wctomb - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
  64. ^ "mbstowcs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  65. ^ "wcstombs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  66. ^ "btowc - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  67. ^ "wctob - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  68. ^ "mbsinit - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  69. ^ "mbrlen - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  70. ^ "mbrtowc - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  71. ^ "wcrtomb - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  72. ^ "mbsrtowcs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  73. ^ "wcsrtombs - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  74. ^ "mbrtoc8 - cppreference.com". En.cppreference.com.
  75. ^ "c8rtomb - cppreference.com". En.cppreference.com.
  76. ^ "mbrtoc16 - cppreference.com". En.cppreference.com.
  77. ^ "c16rtomb - cppreference.com". En.cppreference.com.
  78. ^ "mbrtoc32 - cppreference.com". En.cppreference.com.
  79. ^ "c23rtomb - cppreference.com". En.cppreference.com.
  80. ^ "6.3.2 Representing the state of the conversion". The GNU C Library. Retrieved 31 January 2017.
  81. ^ "root/src/multibyte/c16rtomb.c". Retrieved 31 January 2017.
  82. ^ "Contents of /stable/11/lib/libc/locale/c16rtomb.c". Retrieved 31 January 2017.
  83. ^ "atof - cppreference.com". En.cppreference.com. 31 May 2013. Retrieved 6 March 2014.
  84. ^ "atoi, atol, atoll - cppreference.com". En.cppreference.com. 18 January 2014. Retrieved 6 March 2014.
  85. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
  86. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
  87. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
  88. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  89. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  90. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  91. ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
  92. ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  93. ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 February 2014. Retrieved 6 March 2014.
  94. ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com. Retrieved 6 March 2014.
  95. ^ "WG14-N3020 : Qualifier-preserving standard library functions, v4" (PDF). open-std.org. 13 June 2022.
  96. ^ C99 근거, 7.20.1.1
  97. ^ "bzero". The Open Group. Retrieved 27 November 2017.
  98. ^ "bzero(3)". OpenBSD. Retrieved 27 November 2017.
  99. ^ "memccpy". Pubs.opengroup.org. Retrieved 6 March 2014.
  100. ^ "mempcpy(3) - Linux manual page". Kernel.org. Retrieved 6 March 2014.
  101. ^ "strcasecmp(3) - Linux manual page". Kernel.org. Retrieved 6 March 2014.
  102. ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com. Retrieved 22 April 2022.
  103. ^ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l". docs.microsoft.com. Retrieved 22 April 2022.
  104. ^ "strdup". Pubs.opengroup.org. Retrieved 6 March 2014.
  105. ^ "strerror(3) - Linux manual page". man7.org. Retrieved 3 November 2019.
  106. ^ "String stricmp()". C Programming Expert.com. Retrieved 6 March 2014.
  107. ^ a b "strlcpy, strlcat — size-bounded string copying and concatenation". OpenBSD. Retrieved 26 May 2016.
  108. ^ a b c d Todd C. Miller; Theo de Raadt (1999). "strlcpy and strlcat – consistent, safe, string copy and concatenation". USENIX '99.
  109. ^ "strsignal". Pubs.opengroup.org. Retrieved 6 March 2014.
  110. ^ "strtok". Pubs.opengroup.org. Retrieved 6 March 2014.
  111. ^ 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.
  112. ^ libc-alpha 메일링 리스트, 2000년 8월 8일부터 선택된 메시지: 53, 60, 61
  113. ^ strlcpy의 우여곡절; LWN.net
  114. ^ "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).
  115. ^ strlcpy(3) 리눅스 라이브러리 기능 매뉴얼 "그러나 strlcpy()와 strlcat()의 전체 목적을 무시하기 때문에 이러한 최적화의 타당성에 의문을 제기할 수 있습니다.사실, 이 매뉴얼 페이지의 첫 번째 버전은 틀렸습니다."
  116. ^ "libbsd". Retrieved 21 November 2022.
  117. ^ "root/src/string/strlcpy.c". Retrieved 28 January 2017.
  118. ^ "root/src/string/strlcat.c". Retrieved 28 January 2017.
  119. ^ Todd C. Miller. "strlcpy.c". BSD Cross Reference.
  120. ^ Todd C. Miller. "strlcat.c". BSD Cross Reference.
  121. ^ Lovell, Martyn. "Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries". Retrieved 13 February 2015.
  122. ^ "The C11 standard draft" (PDF). §K.3.1.4p2. Retrieved 13 February 2013.{{cite web}}: CS1 메인 : 위치 (링크)
  123. ^ "The C11 standard draft" (PDF). §K.3.6.1.1p4. Retrieved 13 February 2013.{{cite web}}: CS1 메인 : 위치 (링크)
  124. ^ "Parameter Validation".
  125. ^ "The C11 standard draft" (PDF). §K.3.7.2.1p4. Retrieved 13 February 2013.{{cite web}}: CS1 메인 : 위치 (링크)
  126. ^ Danny Kalev. "They're at it again". InformIT. Archived from the original on 15 January 2012. Retrieved 10 November 2011.
  127. ^ Safe C Library. "The Safe C Library provides bound checking memory and string functions per ISO/IEC TR24731". Sourceforge. Retrieved 6 March 2013.
  128. ^ "Field Experience With Annex K — Bounds Checking Interfaces". Retrieved 5 November 2015.
  129. ^ "MSC06-C. Beware of compiler optimizations". SEI CERT C Coding Standard.
  130. ^ memset_s(3) FreeBSD 라이브러리 기능 매뉴얼

외부 링크

  • 다양한 유형의 CPU 명령 아키텍처를 대상으로 하는 C의 빠른 memcpy, 다중 C 코딩 예제