문자열이 비어있을 때 false를 반환하기 위해 strcmp를 수행하는 좋은 방법입니까?
문제
나는 또 다른 조건을 원합니다 -빠른 실행 시간을 유지하지만 더 안전합니다- 문자열이 비어 있거나 두 줄이 비어 있으면 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()
첫 번째 다른 캐릭터에서 멈출 것입니다. 위의 "특별한 경우"에 만족하는 것처럼 두 줄이 비어 있으면, 이것은 당신이 주신 예만큼 빨리 처리됩니다.
위와 같이 비어있는 두 줄 모두에 대한 특수 핸들러를 추가함으로써, 당신은 그들이 아닌 경우에만 느린 경우에만 만들었습니다.
제휴하지 않습니다 StackOverflow