C에서 EOF까지 스캔프를 어떻게 읽습니까?
나는 이것을 가지고 있지만 일단 그것이 추정되는 EOF에 도달하면 루프를 반복하고 다시 스캔합니다.
int main(void)
{
char words[16];
while(scanf("%15s", words) == 1)
printf("%s\n", words);
return 0;
}
시도:
while(scanf("%15s", words) != EOF)
당신은 비교해 볼 필요가 있습니다.scanf생산.EOF
다음의 너비를 지정하고 있습니다.15형식 문자열에서는 최대 15자를 읽을 수 있습니다.따라서 단어 배열은 크기가 커야 합니다.16(15 +1위해서nullchar). 그럼 다음과 같이 선언합니다.
char words[16];
스캔프는 항상 가치보다 훨씬 더 문제가 많습니다.여기에 여러분이 하려는 일을 하는 두 가지 더 나은 방법이 있습니다.이 첫번째 것은 당신의 코드를 다소 직역한 것입니다.이것은 더 길지만 스캔프와는 달리 이것을 보고 이것이 무엇을 하는지 명확하게 볼 수 있습니다.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char buf[1024], *p, *q;
while (fgets(buf, 1024, stdin))
{
p = buf;
while (*p)
{
while (*p && isspace(*p)) p++;
q = p;
while (*q && !isspace(*q)) q++;
*q = '\0';
if (p != q)
puts(p);
p = q;
}
}
return 0;
}
그리고 또 다른 버전이 있습니다.검사로 이것이 무엇을 하는지 확인하는 것은 조금 어렵지만, 한 줄이 1024자보다 길면 끊어지지 않기 때문에 제가 제작에 사용할 코드입니다. (음, 실제로 제작에 사용할 코드는 다음과 같습니다.tr -s '[:space:]' '\n', 이것이 바로 그와 같은 것을 구현하는 방법입니다.)
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int ch, lastch = '\0';
while ((ch = getchar()) != EOF)
{
if (!isspace(ch))
putchar(ch);
if (!isspace(lastch))
putchar('\n');
lastch = ch;
}
if (lastch != '\0' && !isspace(lastch))
putchar('\n');
return 0;
}
코드가 한 단어를 읽을 때까지 루프를 한 다음 종료합니다.따라서 여러 단어를 입력하면 첫 번째 단어를 읽고 종료되는 반면 빈 입력을 입력하면 영원히 순환됩니다.어떤 경우든 초기화되지 않은 메모리에서 임의의 가비지만 인쇄합니다.이것은 분명히 당신이 원하는 것이 아닌데, 당신이 원하는 것은 무엇입니까?첫 단어(존재하는 경우)만 읽고 인쇄하려면 다음을 사용합니다.
if (scanf("%15s", word) == 1)
printf("%s\n", word);
단어를 읽을 수 있는 한 루프를 하려면 다음을 사용합니다.
while (scanf("%15s", word) == 1)
printf("%s\n", word);
또한 다른 사람들이 언급한 것처럼 단어 배열을 스캔하기에 충분한 크기로 지정해야 합니다.
char word[16];
다른 사람들은 얼마나 많은 아이템이 스캔되었는지를 확인하는 대신 EOF 테스트를 제안했습니다.EOF가 없는 한 스캔f가 일치하지 않을 수는 없지만 다른 경우(정수 읽기 시도 등)에는 스캔f가 EOF에 도달하지 않고는 아무것도 일치하지 않고(입력이 숫자가 아닌 경우) 0을 반환하는 경우에는 괜찮습니다.
편집하다
제가 실행할 때 잘 작동하는 코드와 일치하도록 질문을 변경하신 것 같습니다. EOF에 도달할 때까지 단어를 읽고 종료합니다.그래서 코드에 다른 일이 일어나고 있습니다. 아마도 David가 제안한 대로 입력을 하는 방법과 관련이 있을 것입니다.
윈도우를 사용하고 계시다면,EOFEnter 키를 눌러 도달하는 것이 아니라 콘솔에서 Z+ 키를 눌러 도달합니다.이것은 표시기인 "^Z"를 인쇄합니다.EOF. 이 글을 읽을 때의 함수의 동작(theEOF또는 +):Z
| 기능. | 산출량 |
|---|---|
scanf(...) |
EOF |
gets(<variable>) |
NULL |
feof(stdin) |
1 |
getchar() |
EOF |
반품 값을 확인해야 합니다.EOF, 반대하지 않는1.
예제에서는 두 개의 다른 변수 이름을 사용했습니다.words그리고.word, 신고만 한words, 길이를 선언하지 않았습니다. 15자에 16자를 더해서 읽어 들여야 합니다.NUL성격.
가장 좋은 방법은...
int main()
{
char str[100];
scanf("[^EOF]",str);
printf("%s",str);
return 0;
}
C 사용자의 경우에도 이 기능이 적용됩니다.
while ( gets(str) != NULL )
언급URL : https://stackoverflow.com/questions/3764014/how-do-you-read-scanf-until-eof-in-c
'programing' 카테고리의 다른 글
| C에서 ENUM을 함수 인수로 전달하는 방법 (0) | 2023.10.31 |
|---|---|
| PowerShell을 사용하여 클립보드로 파이프 출력 (0) | 2023.10.31 |
| 페이지 속도 인사이트 Google Retackcha에 사용되지 않는 자바스크립트 제거 (0) | 2023.10.31 |
| 정수에 필요한 바이트 수를 결정하는 방법은? (0) | 2023.10.31 |
| jquery - .done (),의 사용 .done () .다음으로 () 및 .ajax 요청을 지정된 순서로 수행하기 위한 () 시 (0) | 2023.10.31 |