저는 stdsin과 함께 fgets를 사용하여 일부 데이터를 읽었습니다. 최대 길이는 25 초입니다.이 코드에서 실행중인 테스트 중 하나를 사용하면 몇 백 내가 원하는 데이터 다음에 공백이 생기면 프로그램이 실패하게됩니다.fgets를 사용할 때 여분의 공백을 무시합니다
fgets를 사용할 때 이러한 여분의 공백을 모두 무시하고 다음 행으로 이동하는 방법에 관해 조언 해 줄 사람이 있습니까?
저는 stdsin과 함께 fgets를 사용하여 일부 데이터를 읽었습니다. 최대 길이는 25 초입니다.이 코드에서 실행중인 테스트 중 하나를 사용하면 몇 백 내가 원하는 데이터 다음에 공백이 생기면 프로그램이 실패하게됩니다.fgets를 사용할 때 여분의 공백을 무시합니다
fgets를 사용할 때 이러한 여분의 공백을 모두 무시하고 다음 행으로 이동하는 방법에 관해 조언 해 줄 사람이 있습니까?
반복적으로 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')
;
}
그 코드는 단순히 다음 개행까지의 모든 문자를 무시합니다. 공백인지 확인하려면 (내부) 루프에 테스트를 추가하십시오. 그러나 문자가 공백이 아닌 경우 수행 할 작업을 결정해야합니다.
로 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를 쓸 때보다 빠릅니다.
fgets는 int, fyi가 아닌 문자열에 대한 포인터를 반환합니다.) – Gary
'getc()'는 파일 포인터 (아마도 stdin이라는 질문에)가 필요하지만'getchar()'은 stdin을 가정합니다. 그리고 EOF를 조심하십시오. 파일에 개행 문자가 없으면 내부 루프가 멈추지 않을 것입니다. –
이 코드를 사용해보십시오. 뒤 공백.
char str[100] ;
int i ;
fgets (str , 80 , stdin) ;
for (i=strlen(str) ; i>0 ; i--)
{
if (str[i] != ' ')
{
str[i+1]='\0';
break ;
}
}
'sizeof (str)'을 80보다 우선 사용하십시오. –
getchar()을 사용하는 방법이 있었으면 좋겠다. 모든 공백을 무시한다. 나는 단지 시도했다 : while ((ch = getchar())! = '\ n'&& (int) ch! = EOF); 하지만 무한 루프가 발생했습니다. – Gary
''c'를'int'로 선언하고'char'로 선언하지 않았습니다. 나는 또한 개행 전에 EOF를 테스트했지만,'char'가 아닌'int'에 할당하면 다른 방법으로 작동합니다. 함수 (매크로)'getc()'와'getchar()'은'char'가 아니라 INTEGER를 리턴한다는 것을 기억하십시오. 네가 세 번 들었던 모든 것은 사실이다. –