2013-04-13 2 views
3

텍스트 파일을 열고 알파벳 단어 만 읽고 싶습니다. 예를 들어, "Hello-World Hey"라는 텍스트 파일이있는 경우. 나는 "Hello", "World", "Hey"라는 단어를 읽고 싶다.알파벳 문자로만 읽기 - C

문제는이 출력에 대해 "형식 지정자"가 무엇인지 잘 모르겠습니다. 나는 수많은 조합을 시도했지만 아무도 희망대로 일하지 않았습니다.

FILE *fpin; 
char str[50]; 

while (fscanf(fpin, "%s[a-zA-Z]", str) != EOF) { 
    // do something with str 
} 

모든 도움을 주시면 감사하겠습니다. 감사.

+0

심각하게도, 누가 scanf가 좋은 아이디어인지 계속해서 C 초심자에게 말하고 있습니까? 그렇다면 다음 단어를 읽으려면 다음 단어를 읽어야합니다. – kay

+0

@ 케이 내가 직접 C 초보자이며, 더 나은 옵션은 무엇이며 왜 scanf는 나쁜 생각입니까? (나는 그 질문이 적대적이라고 생각하지만, 실제로 알고 싶다.) – NickO

+1

@ 케이 교수, 책, ... 올바르게 사용하면 강력하다. –

답변

6

거의 다 왔어. 스캔 세트를 사용해야하지만 스캔 세트에도 s 변환이 없습니다.

49는 버퍼 오버플로를 방지합니다 (예, 배열의 크기보다 작아야합니다).

물론 이것은 첫 번째 단어에 적용됩니다.

while (fscanf(fpin, "%49[a-zA-Z]", str) == 1) 
{ 
    ...do something with word in str... 
    if (fscanf(fpin, "%49[^a-zA-Z]", str) != 1) 
     ...decide what to do... 
     ...but remember one problem might be that the 'word' was too long... 
} 
+0

대단히 고마워요! – mason

2

나는 프로그래밍에 익숙하지 않지만 어쩌면 이것이 당신이 찾고있는 것이다. 도움이 되길 바랍니다.

#include <ctype.h> 

int i = 0; 
FILE *fpin; 
char c, str[50]; 

while ((c = fgetc(fpin)) != EOF) 
{ 
    if(isalpha(c)) 
     str[i++] = c; 

} 
str[i] = '\0'; 
// do something with str 
+1

배열을 종료하지 않고 char이 아닌 EOF를 검사하는 것은 잘못되었습니다. –

+0

'fgetc()'와 그 친척은'char'가 아니라'int'를 반환한다는 것을 기억하십시오. 그 이유는 256 개의 가능한 문자 값 (8 비트'char' 타입을 가정)과 고유 한 값 EOF를 식별해야하기 때문입니다. 'char'가 부호가 없다면, EOF 테스트는 사실이 될 수 없습니다 (EOF가 발생할 때 당신은 발견하지 못할 것입니다). 만약'char'가 서명 되었다면, 어떤 유효한 문자, 흔히 ÿ, y- 움라우트, U + 00FF, 라틴어 작은 글자 Y (DIAERESIS, 0xFF)로 EOF를 오 검출 할 것입니다. –

+0

@Jonathan Leffler fgetc라는 넓은 char 변종이 있습니다 (EOF 대신 WEOF가 있음). 비록 그것이 당신이 염두에 두었던 것이 확실하지는 않지만. 나는 내 컴퓨터에서 이것을 시도했다. 그것은 정상적으로 작동하는 것처럼 보인다. 어쨌든, 당신은 200K 이상의 담당자가 있습니다 - 내 지식은 당신과 거의 비교할 수 없습니다. – Venom

관련 문제