scanf ()! = EOF, сценарий все еще ожидает дальнейшего ввода - PullRequest
0 голосов
/ 07 августа 2020

В настоящее время застрял, пытаясь сломать for l oop после того, как все разделенные пробелы были захвачены. Я потратил более часа на всевозможные страницы, и мой код выглядит идентично тому, что я обнаружил в других статьях. scanf ()! = EOF никогда не возникает в моем коде.

int readInput(unsigned char input[], size_t inputMaxLength)
{
    int size = 0; // We want to return the length of the string

    for ( int i = 0; i < inputMaxLength ; i++) { // We only want to capture n amount of chars
        if (scanf("%hhu", (input + i)) != EOF) { // input + i to iterate through the input array
            printf("i = %d , Read %d\n", i , *(input + i)); 
            size++;
        } else {
            return size; // this never occurs which means scanf never == EOF
        }
    }
    return size;
}

вывод выглядит так,

12 65 98 45 44
i = 0 , Read 12
i = 1 , Read 65
i = 2 , Read 98
i = 3 , Read 45
i = 4 , Read 44

К сожалению, эта функция никогда не возвращает размер, и сценарий остается в ожидании для дальнейшего ввода. Кроме того, это ограничение заключается в том, что я должен использовать scanf для захвата входных данных для этой функции.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Этот if блок

if (scanf("%hhu", (input + i)) != EOF) 
{ 
  // input + i to iterate through the input array
  printf("i = %d , Read %d\n", i , *(input + i)); 
  size++;
}

всегда будет истинным for итерация i = 0 до i = inputMaxLength. Потому что scanf("%hhu", input+i) вернет 1, которое не равно EOF(-1). Вот почему скрипт все еще ожидает дальнейшего ввода, я полагаю, если вы нажали CTRL + Z на windows или CTRL + D на linux где-то между 0<=i<inputMaxLength .

Вы можете изменить этот фрагмент примерно так:

int readInput(unsigned char input[], size_t inputMaxLength)
{
    int size = 0;
    for ( int i = 0; i < inputMaxLength ; i++)
    {
        scanf(" %c", input+i);
        if ( *(input+i) != '\n' )
        {
            printf("i = %d , Read %d\n", i , *(input + i));
            size++;
        }
        else
        {
            return size;
        }
    }
    return size;
}
0 голосов
/ 07 августа 2020

Если вы вводите ввод из файла, я думаю, он должен работать нормально, но если вы вводите ввод с терминала, то после ввода чисел с пробелами (например, 15 20 39) вы нажимаете ввод, который является новой строкой символ \n не EOF.

Для терминала вы выполнили несколько logi c вот так

  • Так как последнее всегда будет <char><newline>, так что если делать scanf например, scanf("%hhu%c", (input + i), &temp).
  • Затем мы можем отметить конечное условие, например
if (temp == '\n')
{
    // add the last character in the array then break
}

Я следил за logi c, как указано выше, и тестировал код на сайте onlinegdb.com (это немного избыточно, вы можете очистить его позже)

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <stdio.h>
#include<malloc.h>

int readInput(unsigned char input[], size_t inputMaxLength)
{
    int size = 0; // We want to return the length of the string

    for ( int i = 0; i < inputMaxLength; i++) { // We only want to capture n amount of chars
        char c, d;
        scanf("%hhu%c", &c, &d);
        if (d != '\n') { // input + i to iterate through the input array
            *(input + i) = c;
            printf("i = %d , Read %d\n", i , *(input + i)); 
            size++;
        } else {
            *(input + i) = c;
            printf("i = %d , Read %d\n", i , *(input + i)); 
            size++;
            printf("Returning size\n");
            return size; // this never occurs which means scanf never == EOF
        }
    }
    return size;
}

int main()
{
    size_t a = 5;
    unsigned char *input = (char *)malloc(a*sizeof(char));
    printf("%d", readInput(input, a));
    return 0;
}

Вот мой результат для тестового примера

12 34 5                                                                                                                                                                       
i = 0 , Read 12                                                                                                                                                               
i = 1 , Read 34                                                                                                                                                               
i = 2 , Read 5                                                                                                                                                                
Returning size                                                                                                                                                                
3
...