2017-12-20 17 views
1

strchr() 구현을 작성하려고했습니다.두 번째 인수가 작은 따옴표 ('text') 문자열 인 경우 strchr이 NULL을 반환하지 않는 이유

char *ft_strchr(const char *s, int c) 
{ 
(unsigned char)c; 
    while (*s) 
    { 
     if (*s == c) 
      return ((char *)s); 
     s++; 
    } 
    if (c == '\0') 
     return ((char *)s); 
    return (NULL); 
} 

그것은이를 제외한 대부분의 경우 유사한 작동합니다

printf("%s\n", strchr("Whats up with you, men", ' up')); 

strchr 반환

p with you, men 

동안 저 버전 ft_strchr 반환

NULL 내가 궁금 이유 strchr 어느쪽으로 든 행동합니다. ' up'unsigned char으로 변환하면 'p'(int 538998128)가됩니다.

또한 여기에서는 다른 구현을 발견했으며이 데이터에서도 strchr으로 작동합니다.

char *ft_strchr(const char *s, int c) { 
    while (*s != (unsigned char) c) { 
     if (!*s) 
      return NULL; 
     s++;} 
    return (char *)s; 
} 

또한 내 버전이 다른 나는 그들이 유사한 작동합니다 생각하지만 그들은하지 않습니다. 왜 진짜 관심 있니?

미리 감사드립니다. 이 식에서

+0

'(unsigned char) c;'는 한 줄에'c'의 형식을 변경하지 않지만 여전히'int'입니다. –

+1

''up ''을 여러 문자로 전달하지만, 비교할 때 하나의 문자로 취급합니다. 실제로 1 문자 이상을 검색하려는 경우 문제가 발생합니다. 컴파일러가 하나 이상의 문자를 포함하는 문자 리터럴을 구현 정의로 처리하는 방법을 알아야합니다. 아마도 컴파일러는 마지막 'p'또는 다중 문자 리터럴의 첫 번째 공백 만 유지합니다. – nos

+0

@nos 감사합니다. 이해합니다. 테스트 사례 일뿐입니다. 문제는 캐스팅이 잘못되었습니다 (표현식에 있어야 함). –

답변

0

: 형식 char이다

*s == c 

용어 *s는, 서명 또는 서명되는 char 여부에 따라, 255 중 -128 (127)에 0의 범위를 갖는다. c 값 538998128이이 범위를 벗어나므로 비교가 사실이 아닙니다. 함수의 시작에서

, 당신은이 라인이 있습니다

(unsigned char)c; 

을하지만 이것은 아무것도하지 않습니다. c 값을 unsigned char으로 캐스팅하고 결과 값을 사용하지 않습니다. c의 값은 변경되지 않습니다.

당신이 보여 다른 구현은 다음이 *s로 값을 주조 비교 한 cunsigned char에와 캐스트. 이것이 다른 구현이 예상 한 결과를 제공하는 이유입니다.