2011-03-04 2 views
1

내가 문자열 "텍스트", 캐럿 위치 "캐럿"이 다음 (공백으로 구분) 현재 단어를 찾으려면 말.가장 효율적인 방법은 문자 배열에서 현재 단어를 얻을 수

나는 현재를하고 있어요 방법은 비효율적 인 것 같습니다 누군가가 그 일을하는 효율적인 방법이 있다면 궁금 해서요? "비효율적 인 것"으로

const char* text; 
int caret; 
int initpos; 
int start; 
int count = 0; 
char word[256]; 

// text and caret values assigned here. 

initpos = caret; 
while(caret > 0 && text[caret] != ' ') // get start 
{ 
    caret--; 
    count++; 
} 
start = caret; 
caret = initpos; 

while(text[caret] && text[caret] != ' ') // get end 
{ 
    caret++; 
    count++; 
} 

word = strsub(text, start, count); 
+0

에 의해 종료 될 때, 당신은 배열 이름입니다 말씀을 할당 할 수 없습니다. – unwind

+0

이 코드를 깨뜨리는 것은 어렵습니다. (@ unwind의 주석과 초기화되지 않은'캐럿 (catcht) '을 가정하고, 배열 범위를 벗어나서 걷는 것은 문제를 쉽게 게시하고 토론 할 수있는) - 당신은 모든 캐릭터를 앞뒤로보아야 만하고, 개인 캐릭터 검사보다 빠른 공간을 찾는 트릭을 찾는 것은 거의 불가능 해 보입니다. – sarnold

+0

어쩌면 공백 이외에 가로 탭 등도 고려하고 싶을 것입니다. – Flinsch

답변

5

, 당신은 코드 당신에게 비효율적을 보이거나 당신이 을 측정하고 목적을 위해 너무 느린 발견 한 것을 의미합니까?

귀하의 방법은 O (N) N이 당신의 입력에서 가장 긴 단어의 길이이다 조치를 취하고 있습니다. 귀하의 단어가 DNA 문자열의 크기를 가지지 않으면 꽤 빠릅니다.

더 빠른 방법은 일부 데이터 세트, 단어의 시작 및 종료 위치의 인덱스를 사용하는 것입니다. 간격을 저장하는 이진 검색 나무는이 법안을 맞는 것이나, N이 입력 단어의 수는 O의 비용 (N LG ) 검색 시간에. 아마도 그만한 가치는 없습니다.

0
#include <ctype.h> 

... 
// Other definitions from above. 
char *p = word; 
char *q = text + caret; 
while(q >= text && !isblank(*q)) { 
    q--; 
} 
if (q < text) q++; // All non-blanks. 
while (*q && !isblank(*q)) { 
    *p++ = *q++; 
} 
*p = '\0'; 
// word now has nul terminated non-blank characters, p points to EOL or blanks. 
+0

제공된 샘플 코드와 같지 않다고 생각합니다. 단어의 시작 부분을 찾기 위해 "뒤로"보지 않습니다. 원래 포스터가 원하는 것을 더 보려면'vim'을 시작하고'v'로 시각적 선택 모드로 들어가'aW'를 사용하여 'a Word'를 선택하십시오. 커서를 단어의 어느 위치에 배치하든 단어 전체가 선택됩니다. – sarnold

+0

@sarnold : 네 말이 맞아. 커피가 더 필요해. 처음에는 공백이나 문자열의 시작을 찾는 백 워드를 따라야합니다. –

1

효율적인 접근이라고 생각합니다. 문자가 공백이 아닌 문자인지 아닌지 확인하는 것이 좋습니다.

while(caret > 0 && ((text[caret]>='A' && text[caret]<='Z') || (text[caret]>='a' && text[caret]<='z'))) 

이렇게하면 다른 경우를 포착합니다. 단어는 점, 숫자, 그 코드는 컴파일되지 않습니다 브라켓 등

+1

은 왜'isalpha에은()'대신 (''에 선언)하지? 당신의 상태는'''또는 'ÿ' 또는 다른 많은 단어 형성 문자를 "잡아 내지 못합니다", "isalpha()"는 적절한 로케일 집합과 함께 모든 단어 문자를 포착합니다. – pmg

관련 문제