Программа пропускает ввод символа в цикле - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго дня.

Задание:

Произвольная последовательность переменных типа char, int и long. Перед каждой переменной размещается байт, определяющий ее тип (0-char, 1-int, 2-long). Последовательность вводится в виде целых переменных типа long, которые затем «укорачиваются» до минимальной размерности без потери значащих цифр.

Проблема:

После запуска предлагает, как и должно, ввести "number of type", далее вводим "value of variable". Переходим к следующей итерации первого цикла и программа уже не предлагает ввести "number of type", а сразу идет запрос на ввод "value of variable". После всех итераций первого цикла программа завершается без ошибок, и без выполнения второго цикла.

Вопрос:

1. Почему пропускает ввод символа при следующих итерациях? 2. Почему не выполняется второй цикл? 3. Правильно ли реализовано задание?

Код:

int main()
{
    char a1=0, i;
    long a, A[N]={0}, *B;
    B=&A[0];
    for(i=0;i<=N-2;i+=2,B++)    
    {
        printf("enter number of type variable:\nchar - 0\nint - 1\nlong - 2\n");
        scanf("%c", &a1);
        *(char *)B=a1;
        printf("\nenter value of variable:\n");
        scanf("%ld", &a);
        *(B++)=a;   
    }
    for(i=0;i<=N-2;i+=2,B++)
    {
        if (*B==0)
            printf("%c ", *(B++));
        else
        {
            if (*B==1)
                printf("%d ", *(B++));
            else
            {
                if (*B==2)
                    printf("%ld ", *(B++));
            }
        }
    }
    getchar();
    getchar();
}

Вопросы

актуальны: 2. Почему не выполняется второй цикл? 3. Правильно ли реализовано задание(касается обоих вариантов)?

Задание реализовал иначе:

При помощи односвязного списка.
struct Node             //prototype of node(прототип узла)
{
    char a1;
    long a;
    Node *next;         //pointer to next node(указатель на след. узел)
};
typedef Node *pNode;    //type: pointer to node
 
pNode Head;
 
pNode addNode()     //create new node and add him to top list, return new node
{                   //(создает новый узел и добавляет его в список)
    int r=0;
    char tmp;
    pNode newNode = new Node;
    newNode->next = Head;
    Head=newNode;
    printf("enter number of type variable:\n0 - char,\t1 - int,\t2 - long\n");
    while (!r)              //enter the number type variable with input validation
    {                       //(ввод номера типа переменной, с проверкой правильности ввода)
        fflush(stdin);
        scanf("%c", &tmp);
        if ((tmp=='0')||(tmp=='1')||(tmp=='2'))
        {
            newNode->a1=tmp;
            r=1;
        }
        else
            printf("you enter incorrect number of type, try again\n");
    }
    printf("enter value of variable:\n");
    fflush(stdin);
    scanf("%ld", &newNode->a);          //enter the value of a variable(ввод значения переменной)
    return newNode;
}
void viewVar(pNode Head)        //shows all the input variables(показывает все введенные переменные)
{
    pNode p = Head;
    while (p != NULL)
    {
        if (p->a1=='0') 
            printf("char: %c\n", p->a);
        else 
        {
            if (p->a1=='1')
                printf("int: %d\n", p->a);
            else 
            {
                if(p->a1=='2')
                    printf("long: %ld\n", p->a);
            }
        }
        p=p->next;
    }
    getchar();
    getchar();
}
void main()
{
    int TT=0, Y;
    while (!TT)                     //programm menu
    {
        printf("\n\tMENU\n\n");
        printf("\n1. add new node\n");
        printf("\n2. view variables\n");
        printf("\n3. Exit\n");
        printf("\n\nenter number of paragraph\n");
        scanf("%d", &Y);
        switch (Y)
        {
            case 1: addNode(); break;
            case 2: viewVar(Head); break;
            case 3: TT=1; break;
        }
    }
 
}

По первому вопросу:

1. Почему пропускает ввод символа при следующих итерациях?

Решается вставкой перед scanf(); функции fflush(stdin);

Если поток открыт для ввода, то функция fflush очищает содержимое буфера. После вызова функции поток ос- тается открытым.

Решение задачи: «Программа пропускает ввод символа в цикле»

textual
Листинг программы
void FlushStdin(void)
{
  int ch = 0;
  while ((ch=getchar()) != EOF && ch != '\n');
}

Объяснение кода листинга программы

В данном коде реализована функция FlushStdin, которая предназначена для очистки буфера ввода. В функции используется цикл while, который выполняется до тех пор, пока не будет достигнут конец файла (EOF) или не будет получен символ новой строки (\n). Во время каждого прохода цикла функция getchar() читает очередной символ из стандартного ввода и сохраняет его в переменной ch. Если получен символ новой строки, цикл прекращается. Таким образом, функция FlushStdin позволяет очистить буфер ввода от всех символов, кроме символа новой строки. Это может быть полезно в случаях, когда необходимо обеспечить корректную работу программы, несмотря на возможные ошибки ввода.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы