2012-11-23 40 views
1

程序退出我用C写的下面的程序:Ç - 当输入超过与fgets津贴

与该程序的主要问题是,如果输入使用时与fgets()函数,程序公正出口超过80个字符立即。其他代码被执行,但不等待用户按Enter键。它就像简单地忽略了最后的getchar。

请问我该如何解决这个问题?

+0

您可能需要重新考虑换行符的自动删除(除了您提到的问题,以下简单回答)。如果输入超过80个字符,则缓冲区中不会有新行,并且您正在覆盖用户数据。不是一个严重的错误,只是在这种情况下,会丢失密码内容。 – WhozCraig

回答

2

如果用户输入的长度大于fgets可能从stdin中读取的79个字符(它最多可以读取一个小于其大小参数所说的字符,因为它将0-终止缓冲区),剩余的输入保留在输入缓冲区,因此最后getchar()立即成功。

为了避免这种情况,如果输入过长,您需要清除输入缓冲区。

问题是,如果输入足够短,您不知道是否清除缓冲区。所以,检查你是否实际上得到一个换行符通过fgets阅读,

int len = strlen(password); 
if (password[len-1] == '\n') { 
    // got a newline, all input read, overwrite newline 
    password[len-1] = 0; 
} else { 
    // no newline, input too long, clear buffer 
    int ch; 
    while ((ch = getchar()) != EOF && ch != '\n'); 
    if (ch == EOF) { 
     // input error, stdin closed or corrupted, what now? 
    } 
} 
+0

请问这怎么办? – Matthew

+0

刚刚更新了一种方式来做到这一点;) –

+0

非常感谢你:)这解决了我的问题elegrantly :) – Matthew

1

检查换行符被fgets()阅读,直到遇到一个换行符如果不跳过输入:

if (0 == strrchr(password, '\n')) 
{ 
    /* Skip until new-line. */ 
    int c; 
    while (EOF != (c = getchar()) && '\n' != c); 
} 

否则,致电getchar()将读取什么fgets()没有。