为什么这段代码过早退出?

时间:2010-08-18 01:13:25

标签: c programming-languages stack

    #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 个答案:

答案 0 :(得分:8)

  1. 当用户按下Enter键时,您的缓冲区中有换行符(\n)。
  2. 您拨打getchar()一次,从缓冲区中读取该换行符,该换行符已分配给ch且不等于'y''Y',因此您的循环退出
  3. 至于解决这个问题,这是留给你的练习。除了单独的getchar()之外,你可以考虑使用其他数据读取方法。有关某些输入函数,请参阅here(提示:fgets)。您还可以尝试从缓冲区中提取此字符并将其丢弃,以便后续调用getchar()按预期工作。

    如果这是针对学校的,那么您可能需要编写一个可以在整个课程中重复使用的功能。通过这种方式,您可以对其进行调试,并熟悉其工作原理。

    祝你好运!

答案 1 :(得分:5)

这是因为,当您输入1后跟RETURN键时,两个字符将放入缓冲区(1newline)。

然后第二个newline会选择getchar(),因为它既不是Y也不是y,它会退出。

快速解决问题(但是很糟糕):在getchar();之前添加另一个printf

如果您想要更强大的用户输入,请参阅herehere或使用我的武器库中的近防弹代码:

#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]

你可能还想充实你的pushpopdisplay功能:-)开个玩笑。我假设这是你的下一步。


顺便说一句,如果这个作业,我建议不要把上面的代码作为你自己的工作。你几乎肯定会被当作作弊,因为它最有可能超出你目前接受的教育水平,并且可通过简单的网络搜索获得:输入

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

进入您友好的邻居Google搜索框以查找。

答案 2 :(得分:0)

要注意的小事。 getChar返回int而不是char。这可能会导致各种混乱和意外问题,因为类型可能会有不同的大小。