2012-04-13 3 views
3

코드 :ANSI C - stdin을 단어 단위로 읽는 방법?

#include <stdio.h> 
int main(void) { 
    char i[50]; 
    while(scanf("%s ", i)){ 
     printf("You've written: %s \n", i); 
    } 
    printf("you have finished writing\n"); 

    return 0; 
} 

한 가지 문제는 그것이 예상대로 코드가하지 않는다는 것입니다. 난에 입력 한 경우 :

그것은 출력
abc def ghi. 

을 것입니다 :

You've written: abc 
You've written: def 

내가 그것을 어떻게 해결할 수 있습니까? 목표는 "ENTER"또는 "."에 도달 할 때까지 모든 단어를 stdin에서 읽는 것입니다. (점).

+0

무엇 쓰기에 대해 : 당신이 .을 찾는 독서 중지하려면

  • , 당신은 다음과 같은 입력 문자열에서 찾기 위해 몇 가지 논리를 추가해야합니다 'scanf ("% s")'를 한 번 실행 한 다음 루프에서'scanf ("% s")'를 호출합니까? –

  • +0

    이 문제를 제외하고는,'scanf ("% 49s", i)'를 사용하여 버퍼 오버런을 막는 습관을 갖도록하십시오. '케이? – dmckee

    +0

    감사하지만 문제를 해결하지 못했습니다. 문제는 while 루프가 마지막 문자 그룹에 도달하기 전에 끝나는 것이며 이것이 수행해야하는 작업이 아닙니다. –

    답변

    5

    @cnicutar는 꽤 가깝지만, 공백이 아닌 다른 것을 읽기만하고, 공백에 도달하면 한 단어를 읽지 않으려 고합니다. 그래서 당신은 스카 셋에 대해 더 많은 것을 원할 것입니다 like :

    while(scanf(" %49[^ \t.\n]%*c", i)) { 
    

    이 경우 첫 번째 공백은 앞의 공백을 건너 뜁니다. 그런 다음 스캔 세트는 공백, 탭, 개행 또는 마침표에 도달 할 때까지 읽습니다. 그런 다음 % * c는 다음 문자 (일반적으로 검색을 중지 한 문자)를 읽습니다 (그러나 버립니다).

    그러나 버퍼 끝에 도달하면 문자를 버릴 수 있으므로 % c를 사용하고 대신 읽을 문자를 제공 할 수 있습니다. 이렇게하면 제공된 버퍼보다 ​​한 단어 더 오래 복구 할 수 있습니다.

    +0

    나는'% * c' 트릭을 좋아한다 :-) – cnicutar

    -1

    가장 쉬운 방법은 flex입니다. 그렇지 않으면 어렵고 복잡한 작업을 반복하고 실수를 저지르기 쉽습니다.

    또한 lex and yacc, 2nd edition을 읽으십시오.

    +3

    글쎄요. –

    +2

    가능합니까? 확실히. 가장 쉬운가요? 아마. – dmckee

    +1

    이 특정 문제에 대해, 그것은 사진 걸이를 걸 때 잭 햄머 (jackhammer)를 사용하는 것과 같습니다. –

    4

    방법에 대해 : 그런

    scanf("%49[ ^\n.]", str) 
    

    또는 뭔가.

    +0

    이것은 실제로 * spaces *에서 깨지지 않습니다. 그렇습니까? – dmckee

    +0

    내 정보를 위해 ... "% 49 [^ \ n.]"은 무엇을 의미합니까? 정규 표현식 같은 거니? 고맙습니다! – nay

    +0

    @dmckee 그렇지 않습니다. 나는 op가 전체 라인을 읽고 싶어한다는 인상하에 있었다. Jerry Coffin이 더 좋은 대답을했습니다. – cnicutar

    1

    도랑 scanf 모두와 fgets로 이동합니다

    while (fgets(i, sizeof i, stdin)) 
    { 
        printf("you've written: %s\n", i); 
    } 
    

    을 다음과 같은주의 사항과 :

    1. 을 방 대상 버퍼에 있다면, fgets는 입력의 일부로서 뒤에 줄 바꿈을 저장합니다 ;

    
        int foundDot = 0; 
        while (fgets(i, sizeof i, stdin) && !foundDot) 
        { 
         char *dot = strchr(i, '.'); 
         char *newline = strchr(i, '\n'); 
    
         if (dot != NULL) 
         { 
         foundDot = 1; 
         *dot = 0; // overwrite the '.' character with the 0 terminator 
         } 
    
         if (newline != NULL) 
         { 
         *newline = 0; // overwrite newline character with 0 terminator 
         } 
    
         /** 
         * Assuming you don't want to print a blank line if you find a dot 
         * all by itself. 
         */ 
         if (strlen(i) > 0) 
         printf("you've written: %s\n", i); 
        }
    관련 문제