소문자화 아스키 코드는 대충 이렇게 만들면 되지 않을까요?
char lower_ascii[ 0x100 ];
char* strstr_i( const char *src, const char *sub )
{
if( !( (size_t)src | (size_t)sub ) ) return NULL;
if( !lower_ascii[ 0xFF ] )
{
size_t i;
for( i = 0; i < 'A'; ++i ) lower_ascii[ i ] = i;
for( ; i <= 'Z'; ++i ) lower_ascii[ i ] = i | 0x20;
for( ; i < 0x100; ++i ) lower_ascii[ i ] = i;
}
char* s = (char*)src;
char* r = (char*)sub;
char* o = s;
while( *s )
{
if( lower_ascii[ *s ] == lower_ascii[ *r ] )
{
s++;
r++;
if ( !*r ) return o - 1;
}
else
{
s = o++;
r = (char*)sub;
}
}
return NULL;
}
저는 아스키 코드 테이블 안쓰는 방법으로 갖고 놀아보고 있어유~
이해가 안가면 한강으로 가면 되나요
이게 테이블 세팅하는 함수죠?
아스키코드를 그대로 옮겼을 경우든, 대문자를 소문자로 바꿔서 옮겼을 경우든, 제일 마지막 바이트는 0xFF 여야 하죠.
아 세팅안돼있으면 하고 그밑에서 strstr하면 되는건가
그러니 만약 strstr_i 함수를 처음 실행해서 아직 아스키 테이블이 준비되지 않은 상태에서는, 테이블을 초기화 하도록 한 코드죠.
초기화 함수를 따로 만들어주거나 전역 초기화 하는 방법을 써도 되는뎅. 뭐 어때? 눈꼽만한 속도차인데 하는 느낌 ㅋㄷ
밑에선 src[i] = lower_ascii[i] 이런식으로 루프돌면 되나여
0x20이랑 or하는건 먼의미인가여?
대문자와 소문자의 차이는, MSB 기준으로 세번째 비트가 1이냐 0 이냐 차이예유
그러니까 32 를 더하냐 빼냐 차인데, 대문자를 소문자로 바꾸는건 +32 를 하면되는데, | 32 가 쨈더 빠르쥬.
보통은 크게 속도차이 안나유 요즘 컴퓨터에선. 아주 근소한 stall 의 차이.
if 다 빼버리고 if (ms != msub) break; 대신에 if (lower_ascii[*sub] != lower_asci[*s]) 하면 되겠지만 검색 문자열을 미리 소문자로 바꿔두면 그럴 필요도 없겠지유~
위 코드는 strstr 보다 8배 느린 버전.
멍청도!