strcasecmp
C 에서 함수 를 다시 구현하려고하는데 비교 과정에서 불일치하는 것으로 나타났습니다.
에서 man strcmp
strcmp () 함수는 두 문자열 s1과 s2를 비교합니다. 로케일은 고려되지 않습니다 (로케일 인식 비교는 strcoll (3) 참조). s1이 각각 s2보다 작거나 일치하거나 s2보다 크면 0보다 작거나 같거나 0보다 큰 정수를 리턴합니다.
에서 man strcasecmp
strcasecmp () 함수는 문자열의 경우를 무시하고 문자열 s1 및 s2를 바이트 단위로 비교합니다. s1이 각각 s2보다 작거나 일치하거나 s2보다 크면 0보다 작거나 같거나 0보다 큰 정수를 리턴합니다.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
이 정보가 주어지면 다음 코드의 결과를 이해하지 못합니다.
#include <stdio.h>
#include <string.h>
int main()
{
// ASCII values
// 'A' = 65
// '_' = 95
// 'a' = 97
printf("%i\n", strcmp("A", "_"));
printf("%i\n", strcmp("a", "_"));
printf("%i\n", strcasecmp("A", "_"));
printf("%i\n", strcasecmp("a", "_"));
return 0;
}
출력 :
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
현재 문자 s1
가 문자이면 현재 문자 가 문자 인지 여부에 관계없이 항상 소문자로 변환됩니다 s2
.
누군가이 행동을 설명 할 수 있습니까? 첫 번째 줄과 세 번째 줄이 동일하지 않아야합니까?
미리 감사드립니다!
추신 :
저는 gcc 9.2.0
Manjaro를 사용 하고 있습니다.
또한 -fno-builtin
플래그로 컴파일 하면 대신 얻을 수 있습니다.
-30
2
2
2
프로그램이 gcc의 최적화 된 기능을 사용하지 않기 때문이지만 질문은 남아 있습니다.
strcasecmp
당신이 말하는 설명이 정확하지 않은 것 같습니다 . upvoted 답변에 대한 자세한 내용.
A < _ && a > _ && A == a
너무 많은 문제를 일으킨다 는 기능 .
unsigned char
. C17 / 18 "문자열 처리 <string.h>"-> "이 하위 절의 모든 기능에 대해 각 문자는 unsigned char
" 유형을 갖는 것처럼 해석됩니다 . char
값이 ASCII 범위 0-127을 벗어나면 차이가 발생 합니다.
printf("%i\n", strcasecmp("a", "_"));
이는 아마도 동일한 결과를 가져야printf("%i\n", strcasecmp("A", "_"));
하지만 대소 문자를 구분하지 않는 두 통화 중 하나 가 대소 문자를 구분하지 않는 것을 의미합니다 .