문자열이 비어있을 때 false를 반환하기 위해 strcmp를 수행하는 좋은 방법입니까?

StackOverflow https://stackoverflow.com/questions/1606596

  •  05-07-2019
  •  | 
  •  

문제

나는 또 다른 조건을 원합니다 -빠른 실행 시간을 유지하지만 더 안전합니다- 문자열이 비어 있거나 두 줄이 비어 있으면 False를 반환합니다.

int speicial_strcmp(char *str1, char* str2 )
{

    if(*str1==*str2 =='\0')
         return 0;

     return strcmp(str1,str2);

}
도움이 되었습니까?

해결책

아니, 그것은 작동하지 않기 때문에 좋은 방법이 아닙니다.

if(*str1==*str2 =='\0')

다음과 같이 평가됩니다.

bool tmp1 = *str1==*str2;
bool tmp2 = tmp1 == '\0';
if (tmp2)

다시 말해, bool은 정수로 홍보되기 때문에 문자열이 다른 문자로 시작할 때마다 테스트가 사실이되게됩니다 (tmp1 거짓이되고 0으로 변환됩니다. tmp2 진실이된다)

컴파일러를 능가하려고하지 마십시오. 빠른 코드를 작성하는 것은 가능한 한 적은 줄의 코드를 작성하거나 가능한 한 짧은 줄을 쓰는 것이 아닙니다. 함께 사슬이 있더라도 == 이런 식으로 의미가 있었기 때문에 더 빠른 이유는 없습니다. 이해하는 코드를 작성하고 올바르게 쓸 수 있습니다.

다른 팁

초기 테스트를 올바르게 구현하더라도 이런 종류의 일을함으로써 더 빨리 일을 할 가능성이 거의 없습니다. strcmp 이미이 일을 할 것입니다.

다음은 코드입니다 strcmp():

int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

이미 의미있게 빠릅니다. 외부 점검은 관심이없는 경우 만 느리게 만듭니다.

if( *str1 == 0 || *str2 == 0 )
   return 0;

주어진 예제는 올바르게 실행되지 않습니다. strcmp() 첫 번째 다른 캐릭터에서 멈출 것입니다. 위의 "특별한 경우"에 만족하는 것처럼 두 줄이 비어 있으면, 이것은 당신이 주신 예만큼 빨리 처리됩니다.

위와 같이 비어있는 두 줄 모두에 대한 특수 핸들러를 추가함으로써, 당신은 그들이 아닌 경우에만 느린 경우에만 만들었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top