C에서 null이 아닌 종료 문자열을 strncmp로 전달하는 것이 합법입니까?
실행 파일의 세그먼트 이름을 포함하는 16바이트 배열을 가지고 있습니다.
char segname[16];
세그먼트 이름 길이가 16바이트 미만이면 나머지는 null 바이트로 채워집니다.그렇지 않으면 종료 null 바이트가 없습니다.
비교하고 싶습니다.segname
다양한 문자열로, 예를 들어.__text
.
전화하는 것이 합법입니까?strncmp
끝이 없는 끈으로?
이 게시물은 그것이 합법적이라고 가정합니다.이 소스 코드는 합법적이기도 합니다.하지만 내 남자 페이지에는 다음과 같이 나와 있습니다.
그
strncmp()
함수는 null-terminated 문자열을 사전 분석적으로 비교합니다.s1
그리고.s2
.
전달된 크기strncmp
의 크기가 될 것입니다.segname
.
저는 제가 무엇을 참조해야 하는지 궁금합니다.
C99 표준, 섹션 7.21.4.4, § 3.에 따르면, 이는 합법적입니다.
그
strncmp
함수는 0보다 크거나 같거나 작은 정수를 반환합니다. 이에 따라 null-terminated 배열이 가리킬 수 있습니다.s1
에서 가리키는 null-terminated 어레이보다 크거나 같거나 작을 수 있습니다.s2
.
그러나 문자 배열이 표시됩니다.정의에 따라 문자 배열이 null로 종료되지 않은 경우 문자열이 아닙니다.
strncmp 함수는 s1이 가리키는 배열에서 s2가 가리키는 배열과 n자 이하(null 문자 뒤에 오는 문자는 비교되지 않음)를 비교합니다.
사양 7.24.4.2에 따르면,C11 표준.
null 문자를 따르지 않는 문자는 비교되지 않으므로 null 끝 문자 배열 또는 문자열이 필요합니다.1
여기에서도 null이 아닌 끝 문자를 사용할 수 있지만, 이 경우 확인해야 할 길이를 지정해야 하므로 경우에 따라 유용합니다.
수정 사항
[1] null 문자를 따르지 않는 문자가 비교되지 않는다는 것은 다음을 의미하지 않습니다.strncmp
null-terminated 문자열이 필요합니다.그것은 단지strncmp
(예를 들어)라고 말하기 위해 특별한 경우가 필요합니다.abc\0def
...그리고.abc\0xyz
대등하게 비교하다null 종단 처리되지 않은 두 개의 문자 배열(지정된 길이까지)을 비교하거나 하나의 null 종단 처리된 문자 배열을 null 종단 처리되지 않은 다른 문자 배열과 비교해도 아무런 문제가 없습니다.
이것은 David Hammen의 논평에서 직접 추가되었습니다.
언급URL : https://stackoverflow.com/questions/41418766/is-it-legal-to-pass-a-non-null-terminated-string-to-strncmp-in-c
'programing' 카테고리의 다른 글
Oracle 11g의 객체 유형 열에서 선택하는 방법은 무엇입니까? (0) | 2023.07.07 |
---|---|
VBA에서 TextFrame 또는 TextFrame2를 사용하는 경우 (0) | 2023.07.07 |
'while' 및 'for' 루프의 범위는 무엇입니까? (0) | 2023.07.07 |
jdbct 템플릿을 통해 sql insert의 ID (0) | 2023.07.07 |
Oracle에서 MySQL로 마이그레이션 (0) | 2023.07.07 |