2011-09-10 3 views
0

내가 scanf가 하나의 단어로 문장을 구문 분석에 사용할 수있는 방법을 알고 단어 내가 갖는 경우`scanf`로 문장을 구문 분석하고 개행을 탐지 할 수 있습니까?

while(1){ 
    scanf("%s", buffer) 
    ... 
} 

을 그러나, 나는 one two three<return> 같은 문장을 입력하면, 어떻게 잠시 루프 내부에서 찾을 수 있습니다 버퍼에 내가 전에 <return>을 누르면 하나입니까?

scanf으로는 거의 가능하지 않지만 비슷한 기능이 있습니까?

답변

2

당신은 전체 라인을 읽을 fgets()를 사용하고, 그래서처럼 구문 분석해야합니다

char buffer[BUFSIZE] = {};  // BUFSIZE should be large enough for one line 
fgets(buffer, BUFSIZE, stdin); // read from standard input, same as scanf 
char *ptr = strtok(buffer, " "); // second argument is a string of delimiters 
            // can be " ,." etc. 
while (ptr != NULL) { 
    printf("Word: '%s'\n", ptr); 

    ptr = strtok(NULL, " ");  // note the NULL 
} 

을 현재 단어가 마지막 단어 인 경우 검사는 간단하다 :

while (ptr != NULL) { 
    char word[BUFSIZE] = {}; 
    strcpy(word, ptr);   // strtok clobbers the string it is parsing 
           // So we copy current string somewhere else. 
    ptr = strtok(NULL, " "); 

    bool is_last_word = (ptr == NULL); 
    // do your thing here with word[] 
} 
+0

줄이 (BUFSIZE-1) 자 이상이어야한다는 사실에 의존하고 있습니다. 그것이 더 많으면 fgets() 호출에서 단어를 깨뜨릴 수 있습니다. –

+0

맞기 때문에 측면에 대한 내 의견. 유일한 다른 방법은이 질문의 범위에 속하지 않는 동적 할당 문자열 버퍼를 사용하는 것입니다. 더욱이, 그렇게한다면 C++을 stringstream과 함께 사용하는 것이 좋습니다. – evgeny

0

당신이 경우 마지막 단어에만 관심이 있다면, 당신은 쉽게 그것을 합리적으로 할 수 있습니다. 제시된 fgets() 솔루션은 라인이 버퍼 크기를 초과하면 복잡해지기 쉽습니다. 여러 fgets() 호출을 통해 단어를 분할 할 수 있습니다. 당신은 그 결말을 다룰 준비를해야합니다.

scanf()는 자체적으로 위험합니다. 버퍼에 임의의 길이의 단어를 읽습니다. 길이 지정자를 사용하는 경우 % s를 항상 사용하는 것을 잊지 마십시오. 나는 당신이 실제로 필요한 것을 얻기 위해 실제로 scanf()를 사용할 수 없다고 확신한다.

문자로 입력 된 문자를 처리하는 것이 가장 좋습니다. 너가 공간을 명중 할 때 너는 낱말 끊음에 있는다. 줄 바꿈을하면 마지막 단어에 도달하게됩니다.

관련 문제