2011-10-23 3 views
-3

텍스트 파일을 구문 분석하고 단어 .word을 발견하면 나머지 줄을 가져 오려고합니다. 다음은 지금까지 내가 가지고있는 것입니다 :문자열에 대한 포인터 - C

char *word_ptr; 

if (strstr(token, ":")){ 
    // Some code 

} 

else if ((word_ptr = strstr(token, ".word"))) { 
    char *string_wanted = word_ptr + 6; 
    printf("Rest: '%s'\n", string_wanted); 
} 

string_wanted이 올바르게 인쇄되지 않습니다. else-if 문에 지정할 때 word_ptr을 올바르게 사용하고 있습니까? string_wanted이 아무 것도 인쇄하지 않습니다. 6 대신 7을 추가하면 'ize'가 인쇄됩니다. 내 텍스트 파일에 단어 크기가 있었지만 이제는 파일을 삭제하고 파일을 삭제하고 다시 만들고 깨끗한 빌드를 완료하면 'ize'라는 단어가 계속 나타납니다 !! 파일에 더 이상 존재하지 않으므로 어디에서 왔습니까 ?? 나는 '크기'라는 단어가 파일에 더 이상 존재하지 않는다는 사실에 실망합니다. 이제

array: .word 0:10 
array_size: .word 10 

난 그냥 두 번째 줄을 제거가 그래서, : array: .word 0:10

왜 아닙니다 여기

(나는 단어 '는 어때'를했을 때) 파일이 속입니다 word_ptr 0시 10 분 그것을 밖으로 6 인쇄 할 때 인쇄? 나는 word_ptr이 .word를 가리키고 있다고 확신한다. 왜냐하면 나는 그것을 인쇄 할 때 .word를 인쇄하기 때문이다. 줄을 토큰화할 때 array:이 토큰 화되어지고 있기 때문에 거기에 도착한다는 것을 알고 있습니다.

제안 사항?

도움 주셔서 감사합니다.

+0

strstr에서 NULL 테스트를 시도 했습니까? – Serdalis

+1

그 이유는 무엇입니까? null이 아닌 경우에만 코드 블록이 실행되지 않습니까? – darksky

+0

사실이 코드의 유일한 문제점은 (테스트 케이스를 제공 한 상태에서) 다른 프로그램에 도달하지 못한다는 것입니다. 내 프로그램에서 모든 것을 해결했을 때, 전체 코드를 게시하십시오. 코드 당신이 게시 한 아무런 문제가 없습니다. – Serdalis

답변

2

여기 서클에서 조금씩 돌아 다니고 있습니다. 나는 당신의 혼란이 지금 어디 있는지 생각해 봅니다. 그래서 나는 그것을 놓으려고 노력할 것입니다. 토크 나이저가 문자열을 가져 와서 토큰으로 나눕니다. 각 토큰은 별도의 문자열입니다. 어떤 문자를 토큰 화하는지 지정하지 않으므로 공백 문자로 가정합니다. 이 경우

문자열 :

배열 :

"배열 :"

"

0시 10분 세 새로운 스트링된다 .word. 단어 "

"0:10 " 두 번째 시간은 '.word "그것은 것입니다 세 번째 시간이 될 것입니다 :

당신이 당신의 토큰에 반복하는 경우"배열 "입니다 루프 token을 통해 먼저 시간을 (당신이 나타납니다) "0:10"이되어야합니다.

이 평가 :

word_ptr = strstr(token, ".word") 

token는 ".word"를 포함하는 반복 중 ".word"를 찾을 수 있습니다. 그런 다음 word_ptr을 6 문자 씩 늘리면 token의 끝을지나 정의되지 않은 메모리로 이동했습니다. 예, '0:10'은 원래 문자열의 '.word'다음 두 문자로 표시되지만 strstr 전화에서 원래 문자열을보고 있지 않습니다. 우리는 단지 token을 찾고 있고 token은 ".word"만을 포함하고 있습니다.

이것이 실패하는 이유입니다. 이 문제를 해결하는 방법은 나머지 구현 방법에 따라 다릅니다.

+0

이것은 정확히 무슨 일이 일어나고 있는지입니다. 토큰 화가 실제로 문자열을 별도의 문자열로 분할한다는 것을 알지 못했습니다. 정말 고맙습니다. 다음 토큰을 가져올 방법을 찾아야합니다. – darksky

2

*string_wantedword_ptr + 6으로 설정하면 이 null이고 문자열을 종료합니다. 그래서 *string_wanted을 인쇄하려고하면 빈 문자열이납니다. 대신 다음 토큰을 가져 오십시오.

+0

왜 'null'을 가리 킵니까? 'word_ptr + 6 '은 오른쪽으로 여섯 개의 점을 이동시키지 않으므로'0 : 10' 문자열의 '0'을 가리 킵니까? – darksky

+0

저는 여러분이 공간에서 토큰 화한다고 가정합니다. 그래서'token' =''.word "'. 어쩌면 토큰 화 코드를 추가해야 할 것입니다. – ObscureRobot

+0

네, 나는 공간에서도 토큰 화하고 있습니다. 하지만 포인터를 증가 시키면 안되나요? – darksky

0

if (strstr(token, ":"))이 모든 문자열에 해당하지 않습니까? 그것은 당신이 요구하는 코드 블록에 도달하지 않을 것입니다.

+0

정말 고마워. – iehrlich

+0

아, 그 점을 무시하십시오. 실제로 코드 블럭에 들어가서 독자를위한 단순성을 위해 많은 조건을 설정했습니다. 나는 그저 if-else 문 블록에있는 것을 보여주고 싶었습니다. – darksky

+0

오류를 증명하는 데 필요한 최소한으로 질문을 업데이트하고 잘 모르는 코드에서 부작용이 보이지 않도록 문제가 여전히 존재하는지 확인하기 위해 최소한의 테스트를 거쳐야합니다. – goto10