2017-02-21 4 views
0

strtok을 사용하여 텍스트 파일을 문자열로 분할하려고합니다. 텍스트 파일에 '\ n', '?,,. ' 등등 ... 맞춤법 검사와 그 줄 번호에 실패한 단어를 인쇄해야합니다. 선을 추적하는 것이 내가 고심하는 것입니다. 나는 지금까지 시도했지만 그것은 단지 텍스트 파일의 첫 번째 행에 대한 결과를 반환C - strtok을 사용하는 중첩 루프

char str[409377]; 
fread(str, noOfChars, 1, file); 
fclose(file); 

int lines=1; 
char *token; 
char *line; 
char splitLine[] = "\n"; 
char delimiters[] = " ,.?!(){}*&^%$£_-+="; 
line = strtok(str, splitLine); 
while(line!=NULL){ 
    token = strtok(line, delimiters); 
    while(token != NULL){ 
     //print is just to test if I can loop through all the words 
     printf("%s", token); 
     //spellCheck function & logic here 
     token = strtok(NULL, delimiters); 
    } 
    line = strtok(NULL, splitLine); 
    lines++ 
} 

중첩 된 루프 동안이 가능 strtok를 사용? 줄 번호를 추적하는 더 좋은 방법이 있습니까?

답변

0

strtok 기능이 재진입이 아닙니다! 여러 문자열을 동시에 토큰 화하는 데 사용할 수 없습니다. 현재 토큰 화 된 문자열에 대한 내부 상태를 유지하기 때문입니다.

현대적인 컴파일러와 표준 라이브러리가있는 경우 대신 strtok_s을 사용할 수 있습니다. 그렇지 않으면 다른 해결책을 생각해 내야합니다.

+0

좋아요, 정리 해 주셔서 감사합니다. 토큰이있는 줄을 추적하는 더 좋은 방법을 생각해 주시겠습니까? 편집 : 좋아, 내가 살펴 보겠습니다, 대단히 도움을 주셔서 감사합니다. –

0

strtok을 사용할 수 있지만 사용하기가 쉽지 않습니다. 그것은 바보 같은 함수입니다. 실제로는 구분자를 nuls로 대체하고 구분 된 시퀀스의 시작 부분에 대한 포인터를 반환합니다. 그래서 파괴적입니다. 영어 단어처럼 하나의 아포스트로피가 허용되는 특수한 경우는 처리 할 수 ​​없습니다 (우리는 단어이므로 we'r'e는 아닙니다), 모든 구분 기호를 구체적으로 나열해야합니다.

자신이 직접 mystrok을 쓰는 것이 가장 좋습니다. 따라서 그것이 어떻게 작동하는지 이해할 수 있습니다. 그런 다음 자신의 단어 추출기의 기초로 사용하십시오.

버그의 원인은 첫 번째 줄을 잘라 버린 것이고 그 다음 줄에는 스트로크가 모두 표시된다는 것입니다.