Подсчет количества пользовательского ввода в программе C - PullRequest
0 голосов
/ 28 сентября 2018
printf("Enter number of patients:");
int numberOfInputs = scanf("%d", &patients);

if (numberOfInputs != 1) {
  printf("ERROR: Wrong number of arguments. Please enter one argument d.\n");
}

Я прошу пользователя ввести одно число в качестве аргумента, но хотел бы распечатать утверждение, если пользователь ничего не вводит или вводит более одного ввода.Например, после запроса «Введите число пациентов:», если пользователь нажимает клавишу ввода, ничего не вводя, я хотел бы распечатать инструкцию.Приведенный выше код - это то, что я специально возился с ним последние пару часов, как предлагали несколько предыдущих постов на этом сайте, но когда я запускаю его в терминале, он не работает.Какие-либо предложения?Заранее спасибо, и все советы очень ценятся!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Это выглядит сверхсложно, но в основном разбивает входные данные, проверяет, чтобы они были точно равны единице, а затем проверяет, что это целое число (и преобразует его).Он отлично работает в цикле и обрабатывает пустой ввод.Я уверен, что есть более элегантные решения этой проблемы, это всего лишь предложение.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

int getNumberOfInput(char* str);
bool isNumber(char* str);

int main()
{
    char str[512];
    while(1)
    {
        printf("Enter text: ");
        fgets(str, 512, stdin);

        int numberOfInput = getNumberOfInput(str);

        if ( numberOfInput == 0 )
            printf("You must give an input\n");
        else if ( numberOfInput > 1 )
            printf("You have to give exactly one input\n");
        else
        {
            if (!isNumber(str))
                printf("The input is not an integer\n");
            else
            {
                int input = atoi(str);
                printf("input: %d\n", input);
            }
        }
    }
    return 0;
}

int getNumberOfInput(char* str)
{
    char* word = strtok(str, " \t\n\v\f\r");
    int counter = 0;
    while(word != NULL)
    {
        ++counter;
        word = strtok(NULL, " \t\n\v\f\r");
    }
    return counter;
}

bool isNumber(char* str)
{
    int i, len = strlen(str);
    for (i=0; i<len; ++i)
        if (!isdigit(str[i]))
            return false;
    return true;
}
0 голосов
/ 28 сентября 2018

Если я правильно понимаю ваш вопрос, вы хотите напечатать ошибку, когда вводом является что-то отличное от целого числа, и это также включает перевод строки.Вы можете сделать это с помощью массива char и спецификатора %[].

Пример:

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    int patients;
    char str[10];
    printf("Enter number of patients:");
    int numberOfInputs = scanf("%[0-9]", str);

    if (numberOfInputs != 1) {
      printf("ERROR: Wrong number of arguments. Please enter one argument.\n");
    }
    patients = atoi(str); //This is needed to convert the `str` back to an integer      
}

Это напечатает ошибку, когда пользователь только нажмет ENTER также.

...