programing

C에서 EOF까지 스캔프를 어떻게 읽습니까?

sourcejob 2023. 10. 31. 21:08
반응형

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

반응형