2010-03-20 3 views
2

저는 stdsin과 함께 fgets를 사용하여 일부 데이터를 읽었습니다. 최대 길이는 25 초입니다.이 코드에서 실행중인 테스트 중 하나를 사용하면 몇 백 내가 원하는 데이터 다음에 공백이 생기면 프로그램이 실패하게됩니다.fgets를 사용할 때 여분의 공백을 무시합니다

fgets를 사용할 때 이러한 여분의 공백을 모두 무시하고 다음 행으로 이동하는 방법에 관해 조언 해 줄 사람이 있습니까?

답변

2

반복적으로 fgets()을 사용한 다음 문자열을 스캔하여 모든 공백 (그리고 줄 바꿈으로 끝나는 지 여부)을 확인하고 일치하는 경우 무시하십시오. 또는 getc() 또는 getchar()을 루프로 대신 사용 하시겠습니까?

char buffer[26]; 

while (fgets(buffer, sizeof(buffer), stdin) != 0) 
{ 
    ...process the first 25 characters... 
    int c; 
    while ((c = getchar()) != EOF && c != '\n') 
     ; 
} 

그 코드는 단순히 다음 개행까지의 모든 문자를 무시합니다. 공백인지 확인하려면 (내부) 루프에 테스트를 추가하십시오. 그러나 문자가 공백이 아닌 경우 수행 할 작업을 결정해야합니다.

+0

getchar()을 사용하는 방법이 있었으면 좋겠다. 모든 공백을 무시한다. 나는 단지 시도했다 : while ((ch = getchar())! = '\ n'&& (int) ch! = EOF); 하지만 무한 루프가 발생했습니다. – Gary

+0

''c'를'int'로 선언하고'char'로 선언하지 않았습니다. 나는 또한 개행 전에 EOF를 테스트했지만,'char'가 아닌'int'에 할당하면 다른 방법으로 작동합니다. 함수 (매크로)'getc()'와'getchar()'은'char'가 아니라 INTEGER를 리턴한다는 것을 기억하십시오. 네가 세 번 들었던 모든 것은 사실이다. –

0

로 getc()에 대해 조나단 레플러에 의해 주어진 제안 맞춤법이 같은

while (!feof(stdin)) { 
    fgets(buf, 25, stdin); 
    ... 
} 

변화를 :

while (!feof(stdin)) { 
    int read = fgets(buf, 27, stdin); 
    if (read > 26) { // the line was *at least* as long as the buffer 
    while ('\n' != getc()); // discard everything until the newline character 
    } 
    ... 
} 

편집

을 나는이 같은 루프가 있다고 가정 : 아, 조나단은 내가 C를 쓸 때보다 빠릅니다.

+0

fgets는 int, fyi가 아닌 문자열에 대한 포인터를 반환합니다.) – Gary

+1

'getc()'는 파일 포인터 (아마도 stdin이라는 질문에)가 필요하지만'getchar()'은 stdin을 가정합니다. 그리고 EOF를 조심하십시오. 파일에 개행 문자가 없으면 내부 루프가 멈추지 않을 것입니다. –

0

이 코드를 사용해보십시오. 뒤 공백.

char str[100] ; 
    int i ; 
    fgets (str , 80 , stdin) ; 
    for (i=strlen(str) ; i>0 ; i--) 
    { 
      if (str[i] != ' ') 
      { 
        str[i+1]='\0'; 
        break ; 
      } 
    } 
+0

'sizeof (str)'을 80보다 우선 사용하십시오. –

관련 문제