Почему этот код выходит преждевременно? - PullRequest
3 голосов
/ 18 августа 2010
    #include <stdio.h>
    #define MAX 5
    int stk[MAX];
    int top=-1;

    main() 
     {
      char ch;
      void push();
      void pop();
     void display();

     do
     {
      printf("1. Push\n");
      printf("2. Pop\n");
      printf("3. Display\n");
      ch=getchar();

         if(ch=='1')
            push();
         if(ch=='2')
            pop();
         if(ch=='3')
            display();

    printf("Do u want to continue y/n"); 
    ch=getchar();
       }while(ch=='y'||ch=='Y');

    }

void push()
 {
   }

void pop()
 {
   }

void display()
 {
   }

В тот момент, когда я заканчиваю операцию нажатия один раз ... программа печатает "" Хотите продолжить y / n "и завершает работу ... не ждет ввода пользователя" "y / Y"

Просьба помочь

Ответы [ 3 ]

8 голосов
/ 18 августа 2010
  1. В вашем буфере есть новая строка (\n) с момента нажатия пользователем клавиши Enter.
  2. Вы вызываете getchar() один раз, читая эту новую строку из буфера, который назначен на ch и не равен 'y' или 'Y', поэтому ваш цикл завершается.

Что касается решения этой проблемы, это оставлено вам в качестве упражнения. Вы можете посмотреть на использование других методов чтения данных, кроме одного getchar(). Смотрите здесь для некоторых функций ввода (подсказка: fgets). Вы также можете попытаться извлечь этот символ из буфера и отбросить его, чтобы последующие вызовы getchar() работали как положено.

Если это для школы, как кажется, вы можете написать функцию, которую сможете использовать на протяжении всего курса. Таким образом, вы можете отладить его и познакомиться с его работой.

Удачи!

5 голосов
/ 18 августа 2010

Это потому, что когда вы вводите 1, а затем клавишу RETURN, два символа помещаются в ваш буфер (1 и newline).

newline затем выбирается вторым getchar(), и, поскольку это не Y и y, он завершается.

Быстрое исправление (но не очень): поставьте еще один getchar(); передprintf.

Если вы хотите более надежный пользовательский ввод, см. здесь , здесь или используйте этот почти пуленепробиваемый код из моего арсенала:

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

#define OK       0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
    int ch, extra;

    // Get line with buffer overrun protection.
    if (prmpt != NULL) {
        printf ("%s", prmpt);
        fflush (stdout);
    }
    if (fgets (buff, sz, stdin) == NULL)
        return NO_INPUT;

    // If it was too long, there'll be no newline. In that case, we flush
    // to end of line so that excess doesn't affect the next call.
    if (buff[strlen(buff)-1] != '\n') {
        extra = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF))
            extra = 1;
        return (extra == 1) ? TOO_LONG : OK;
    }

    // Otherwise remove newline and give string back to caller.
    buff[strlen(buff)-1] = '\0';
    return OK;
}

// Test program for getLine().

int main (void) {
    int rc;
    char buff[10];

    rc = getLine ("Enter string> ", buff, sizeof(buff));
    if (rc == NO_INPUT) {
        // Extra NL since my system doesn't output that on EOF.
        printf ("\nNo input\n");
        return 1;
    }

    if (rc == TOO_LONG) {
        printf ("Input too long [%s]\n", buff);
        return 1;
    }

    printf ("OK [%s]\n", buff);

    return 0;
}

Вот тестовый прогон:

$ ./tstprg
Enter string>[CTRL-D]
No input

$ ./tstprg
Enter string> a
OK [a]

$ ./tstprg
Enter string> hello
OK [hello]

$ ./tstprg
Enter string> hello there
Input too long [hello the]

$ ./tstprg
Enter string> I am pax
OK [I am pax]

Вы также можете немного усовершенствовать функции push, pop и display:-) Просто шучу.Я предполагаю, что это ваш следующий шаг.


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

rc = getLine ("Enter string> ", buff, sizeof(buff));

в поле поиска Google для ваших друзей.выяснить.

0 голосов
/ 18 августа 2010

Маленькая вещь, чтобы отметить.getChar возвращает int, а не char.Это может вызвать всевозможные беспорядки и непредвиденные проблемы, потому что типы могут быть разных размеров.

...