пользователь вводит ноль, чтобы сигнализировать конец ввода в C - PullRequest
0 голосов
/ 03 октября 2018

Прежде чем вы пометите мой вопрос как дубликат, я уже изучал подобные вопросы и ответы:

c: Как сигнализировать о конце ввода

Остановить цикл for, когда пользователь закончит ввод данных в c

Согласно приведенным выше ссылочным вопросам, мой код должен быть правильным, но по какой-то причине я не могу заставить его выйти из цикла иначните печатать выходные данные после ввода пользователем int, такого как ноль или минус один.

Для справки, это школьное задание, и мне пока запрещено использовать «fgets», мы ограничены только использованием «scanf»

Я действительно надеюськто-то может указать мне правильное направление здесь.Все, что я пытаюсь сделать, это попросить пользователя ввести неопределенное количество целых и сохранить их в массиве.Я знаю максимально допустимое количество значений, поэтому я использую массив, однако я хочу дать пользователю возможность сигнализировать о конце ввода, вводя ноль или, возможно, минус единицу.Я знаю, что это должно быть очень просто, но я не могу заставить его работать, пока пользователь не введет символ.

Мой код выглядит следующим образом:

int i = 0;
int j = 0;
int full_sequence[200] = {0};
int numElements = 0;

printf("enter sequence of integers: \n");


for (i = 0; i < 200; i++)
{
    if (scanf(" %d", &full_sequence[i]) ==0)
        break;
        //i've also tried setting i to the maximum index instead of using break, neither of which worked;
        else
        {
            scanf(" %d", &full_sequence[i]);
            numElements++;
        }   
    }

for (j = 0; j < numElements; j++)
{
    printf("\nend of input *********************");
    printf("\nArray element %d is: %d", j, full_sequence[j]);
    printf("\nthe number of non-zero elements is: %d", numElements);
}

return 0;

Я также пытался заменить цикл for на цикл while и пытался использовать отрицательный в качестве сигнала конца входа какследует:

while (testValue >= 0)
{
    scanf("%d", &testValue);

    scanf("%d", &full_sequence[i]);
    {
        i++;
        numElements++;
    }

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

Если я попытаюсь переписать цикл for, чтобы также использовать тестовое значение для проверки элемента scanf перед добавлением его в мой массив, аналогично тому, как оно было в моем цикле while, это выглядит следующим образом:

for (i = 0; i < 100; i++)
    {
        scanf("%d", &testValue);

        if (testValue == 0)
            break;
        else
        {
            scanf("%d", &full_sequence[i]);
            numElements++;
        }
    }

Все равно ничего.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Поскольку существует другой ответ, относящийся к концу кодирования: пользователь традиционно сигнализирует об окончании ввода в консольной программе, набирая управляющий код для конца файла.Это control-D в UNIX, и, следовательно, Linux и OS X или control-Z в Windows (и его предшественники, восходящие к 8-битной эре).

0 голосов
/ 03 октября 2018
#include <stddef.h>  // size_t
#include <stdio.h>   // puts(), printf(), scanf()

enum { max_elements = 200 };  // don't use magic numers, give them a name

int main(void)
{
    int full_sequence[max_elements] = { 0 };
    size_t num_elements = 0;  // the type for sizes of objects in memory and
                              // indexes into them is size_t, not int

    puts("Enter sequence of integers:");

    for (size_t i = 0;
         i < max_elements  // as long as the current index is smaller than the size
         && scanf("%d", &full_sequence[i]) == 1  // an integer could sucessfully be read
         && full_sequence[i] != 0; // and the integer read is not 0
         ++i)  // increase the index
    {
        num_elements = i + 1;  // keep count of the number of elements
    }

    puts("\nEnd of input *********************\n");

    for (size_t i = 0; i < num_elements; ++i)
        printf("Array element %zu is: %d\n", i, full_sequence[i]);

    printf("\nThe number of non-zero elements is: %zu\n", num_elements);
}
...