函数获取垃圾值 #包括 void清除键盘(void) { while(getchar()!='\n');//故意清空执行代码块 } int是(无效) { 字符a,b; printf(“:”); scanf(“%c%c”、&a和&b); 而((a!='Y'&&a!='Y'&&a!='N'&&a!='N')| |(b!='\N')) { 如果(b!='\n')ungetc(b,stdin),scanf(“%*[^\n]%c”,&b); a='n',b='n'; clearKeyboard(); printf(“***无效条目***:”); scanf(“%c%c”、&a和&b); } if(a=='Y'| | a=='Y') { printf(“联系人管理系统:已终止\n”); 返回1; } 其他的 { 如果(a=='N'| a=='N') ContactManagerSystem(); 返回0; } } int菜单(无效) { int i; printf(“0.退出\n\n选择一个选项:>”; scanf(“%d”、&i); while(i6) { printf(“***超出范围***:”); scanf(“%d”、&i); } 返回i; } 无效联系人管理系统(无效) { int i=菜单(); 开关(一) { 案例0: printf(“退出程序?(Y)es/(N)o:”; 是的(); } } 内部主(空) { ContactManagerSystem(); } 因此,我的“是”函数本身运行良好,但当我在内部调用它时

函数获取垃圾值 #包括 void清除键盘(void) { while(getchar()!='\n');//故意清空执行代码块 } int是(无效) { 字符a,b; printf(“:”); scanf(“%c%c”、&a和&b); 而((a!='Y'&&a!='Y'&&a!='N'&&a!='N')| |(b!='\N')) { 如果(b!='\n')ungetc(b,stdin),scanf(“%*[^\n]%c”,&b); a='n',b='n'; clearKeyboard(); printf(“***无效条目***:”); scanf(“%c%c”、&a和&b); } if(a=='Y'| | a=='Y') { printf(“联系人管理系统:已终止\n”); 返回1; } 其他的 { 如果(a=='N'| a=='N') ContactManagerSystem(); 返回0; } } int菜单(无效) { int i; printf(“0.退出\n\n选择一个选项:>”; scanf(“%d”、&i); while(i6) { printf(“***超出范围***:”); scanf(“%d”、&i); } 返回i; } 无效联系人管理系统(无效) { int i=菜单(); 开关(一) { 案例0: printf(“退出程序?(Y)es/(N)o:”; 是的(); } } 内部主(空) { ContactManagerSystem(); } 因此,我的“是”函数本身运行良好,但当我在内部调用它时,c,C,ContactManagerSystem()案例0出于某种原因它变得疯狂了 “是”功能实际上是一个验证检查功能,我需要用户 在“是”或“否”中输入“是”或“否” 等待用户输入“Y”、“Y”、“N”或“N”(表示是或否)。 如果用户回答“是”(“Y”,“Y”),它将结束显示 以下讯息: 联系人管理系统:终止

ContactManagerSystem()案例0出于某种原因它变得疯狂了 “是”功能实际上是一个验证检查功能,我需要用户 在“是”或“否”中输入“是”或“否” 等待用户输入“Y”、“Y”、“N”或“N”(表示是或否)。 如果用户回答“是”(“Y”,“Y”),它将结束显示 以下讯息:

联系人管理系统:终止<(后接换行) 否则,如果用户输入No(“N”、“N”),则应用程序继续运行 显示菜单

尝试:


while
循环的感觉是错误的。假设
a
得到字符
'y'
。然后,因为
'y'!='如果Y'
为true,则将继续循环

这是一个修正的循环

while (  ( !( a =='Y' || a =='y')  &&  !( a =='N' || a =='n') )       ||      (  b !='\n') )
我们想要的
a
Y
Y
N
N
中的一种。如果不是这些,则进入循环。另外,如果
b
不是换行符,则输入循环

while ((a !='Y' && a !='y' && a !='N' && a!='n') || (b!='\n'))
如果
b
不是换行符,那么可能是换行符太长了,因此我们必须排干换行符。首先,将
b
的值放回输入流。然后,告诉
scanf
扫描所有内容直到换行符,然后使用它(进入
b

在准备下一次
scanf
调用以获取输入时,使用将导致循环终止的值预填充
a
b
。这是在
scanf
阻塞的情况下发生的(比如在
EOF
或某些文件输入错误)


代码的其余部分与您的相同。

我认为您需要重新考虑使用
&&
|
,并使用括号。这段代码还负责输入EOF和单词(如“yes”)

    a='n',b='\n';

如下面的注释所述,
scanf()
的问题之一是确保出错行为符合预期。使用或POSIX将整行数据读入缓冲区,然后用括号解析数据通常更容易。

使用括号。如果
a
设置为
'y'
(后跟返回键),则它不等于
'y'
'n'
'n'
,因此
|
条件的计算结果为true。如果您实际键入了
yes
,则会遇到不同的问题。表示EOF会导致应受谴责的行为。
a!=X | | a!=Y
(和
X!=Y
)总是正确的。您不需要
clearKeyboard
。但是当我在ContactManager系统中调用它时,它仍然不起作用。不要从
yes
调用
ContactManager系统。不要再改变你的问题了。这似乎是一个非常复杂的情况。另外,请注意,问题测试
b
与换行符、
'\n'
,而不是
'n'
'n'
。我认为您的意思是与
getchar
循环中的
'\n'
EOF
进行比较,而不是两次
'\n'
。此外,我认为空行会给出错误的结果(
a
将是
”\n
并且读取
b
时将丢失一个字符)。内部
while
循环肯定是一个错误。“空行”条件更有趣。您是对的,行为不是很好,但是
scanf()
在标记空行结束的换行符后键入第二个字符后才会返回。如果第二个字符是另一个换行符,则“gobble”循环将是一个坏主意,但如果有其他字符,则该字符将位于
b
中,并且之前将有一个或多个其他字符需要读取第二行的结尾。因此,在进入“gobble”循环之前,
b
上的条件。谢谢!非常感谢您的帮助。它正在工作,但我不理解代码
while ((a !='Y' && a !='y' && a !='N' && a!='n') || (b!='\n'))
    if (b!='\n') ungetc(b, stdin),scanf("%*[^\n]%c", &b);
    a='n',b='\n';
#include <stdio.h>

int main(void)
{
    char a, b;
    printf("<Please enter a character>: ");
    if (scanf("%c%c", &a, &b) == 2)
    {
        while ((a != 'Y' && a != 'y' && a != 'N' && a != 'n') || b != '\n')
        {
            printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: ");
            if (b != '\n')
            {
                int c;
                while ((c = getchar()) != EOF && c != '\n')
                    ;
            }
            if (scanf("%c%c", &a, &b) != 2)
                break;
        }
        if (a == 'Y' || a == 'y')
        {
            printf("Got yes!\n");
            return 1;
        }
        else if (a == 'N' || a == 'n')
        {
            printf("Got no!\n");
            return 0;
        }
    }
    printf("Got EOF\n");
    return 0;
}
$ ./scan13; echo $?
<Please enter a character>: yes
*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: no
*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: pdq
*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: y
Got yes!
1
$ scan13; echo $?
<Please enter a character>: n
Got no!
0
$ ./scan13; echo $?
<Please enter a character>: Got EOF
0
$