我如何修复C中的if语句以使其按预期工作?
在联系人管理系统的这段代码中,我很难获得一条线路的预期输出。基本上,在这一部分中,当您添加一个新联系人时,它会要求您进入一个公寓,如下所示:我如何修复C中的if语句以使其按预期工作?,c,if-statement,C,If Statement,在联系人管理系统的这段代码中,我很难获得一条线路的预期输出。基本上,在这一部分中,当您添加一个新联系人时,它会要求您进入一个公寓,如下所示: if (yes() == 1) { printf("Please enter the contact's apartment number: "); address->apartmentNumber = getInt(); if (address->apartmentNumber > 0) {
if (yes() == 1)
{
printf("Please enter the contact's apartment number: ");
address->apartmentNumber = getInt();
if (address->apartmentNumber > 0)
{
}
else
{
printf("*** INVALID INTEGER *** <Please enter an integer>: ");
address->apartmentNumber = getInt();
}
}
else
{
address->apartmentNumber = 0;
}
现在,根据我的作业,你应该输入单词而不是数字,明白吗?带出输出的野牛:
*无效整数*请输入一个整数:
在上下文中,这一部分工作得非常好。但是,随后会指示您输入整数-1200,然后会出现提示
*公寓号码无效*请输入正数:
我对这一部分有异议,因为简单地说,我不知道该把它放在哪里,无论是在if语句中还是在它之外。我不确定,希望能得到一些帮助
我自己也尝试过纠正这个问题,但它只给了我两倍的无效整数输出,而不是这个正确的无效公寓号语句。以下是我失败的尝试:
if (yes() == 1)
{
printf("Please enter the contact's apartment number: ");
address->apartmentNumber = getInt();
if (address->apartmentNumber > 0)
{
}
else
{
printf("*** INVALID INTEGER *** <Please enter an integer>: ");
address->apartmentNumber = getInt();
}
if (address->apartmentNumber < 0)
{
}
else
{
printf("*** INVALID APARTMENT NUMBER *** <Please enter a positive number>: ");
address->apartmentNumber = getInt();
}
else
{
address->apartmentNumber = 0;
}
编辑:对于那些要求获取getInt和yes代码的人,请点击此处:
格廷
int getInt(void)
{
int num;
char nl;
scanf("%d%c", &num, &nl);
while (nl != '\n') {
clearKeyboard();
printf("*** INVALID INTEGER *** <Please enter an integer>: ");
scanf("%d%c", &num, &nl);
}
return num;
}
是的:
int yes(void)
{
int yesno, flag;
char c, nl;
scanf("%c%c", &c, &nl);
do {
if (nl != '\n') {
clearKeyboard();
printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: ");
flag = 1;
scanf("%c%c", &c, &nl);
}
else if (c != 'Y' && c != 'y' && c != 'N' && c != 'n') {
printf("*** INVALID ENTRY *** <Only (Y)es or (N)o are acceptable>: ");
flag = 1;
scanf("%c%c", &c, &nl);
}
else if (nl == '\n' && (c == 'Y' || c == 'y' || c == 'N' || c == 'n'))
{
flag = 0;
}
} while (flag == 1);
if (c == 'Y' || c == 'y') {
yesno = 1;
}
else {
yesno = 0;
}
return yesno;
}
getInt将处理非整数文本和单词输入,并将重新提示用户输入整数,直到用户输入整数为止
因此,您的代码需要更像这样:
if (yes() == 1)
{
int validNumber = 0;
while (validNumber == 0)
{
printf("Please enter the contact's apartment number: ");
address->apartmentNumber = getInt();
if (address->apartmentNumber > 0)
{
validNumber = 1;
}
else
{
printf("* INVALID APARTMENT NUMBER * Please enter a positive number:\n");
}
}
}
您的getint函数非常脆弱。用户只输入一次非整数值是什么意思?在接受特定类型的输入时,通常最好持续循环,直到您收到有效输入或用户取消输入,并且始终防止输入与您期望的输入不同,因为当cat在键盘上移动时
如果使用正确,可以使用scanf。这意味着您有责任每次检查scanf的返回。你必须处理三个条件
return==用户通过按Ctrl+d或windows Ctrl+z生成手动EOF来取消输入的EOF,但请参见;
return<发生匹配或输入失败时的预期转换次数。对于匹配失败,必须说明输入缓冲区中剩余的每个字符。在输入缓冲区中向前扫描读取和丢弃字符,直到找到“\n”或EOF;最后
return==表示成功读取的预期转换次数-然后由您检查输入是否满足任何附加条件,例如正整数、正浮点、在所需范围内等。。。
将其与getint函数配合使用,并传递一个字符串,如果该字符串不为NULL,则显示为用户提示,您可以执行类似的操作:
int getint (int *value, const char *prompt)
{
/* loop continually until good input or canceled */
for (;;) {
int rtn; /* variable for return from scanf */
if (prompt) /* if not NULL */
fputs (prompt, stdout); /* display prompt */
rtn = scanf ("%d", value); /* attempt read */
if (rtn == EOF) { /* check for manual EOF */
fputs ("<user canceled input>\n", stderr);
return 0;
}
empty_stdin(); /* all other cases - empty input buffer */
if (rtn == 1) /* good input, break */
break;
/* otherwise matching failure */
fputs (" error: invalid integer input.\n", stderr);
}
return *value; /* value also available through pointer */
}
有很多方法可以将getint组合在一起,根据您的需要进行定制,只要您正确处理上述三种情况,您就可以按照自己喜欢的方式进行操作。?你需要把这个收紧一点。yes和getInt做什么?这些是函数。这是一个绝对庞大的任务,在多个c和头文件上有大量代码。你可以假装它们不在那里,即兴发挥,就好像它们不被需要一样,如果这有帮助的话,任何合适的修复程序都必须传播到getInt中。提示:数字0。你能分享getInt的代码吗?最好是yes?@Joshua Huh?我被这句话弄糊涂了。我想举一个例子来说明你的意思,这可能行得通,但它告诉我有效的输入是未定义的。我应该在哪里定义它?bool false和true表示它们未定义,这会在构建解决方案时导致错误。它的字面定义为bool validInput=false;您还需要什么?我的意思是,在VisualStudio中,它以红色下划线bool、false和true。每当我将鼠标悬停在这三个选项中的任何一个上时,都会显示它们未定义,并给出无法生成解决方案的错误,然后继续调试。这就是我的意思…我倾向于相信你还没有通过hello world学习C的阶段。你熟悉基本的编程概念,如循环、布尔、条件逻辑等吗。。。我已经将validNumber更改为整数,以防您的C编译器还不能识别C中的bool语法。如果这不起作用,你就得自己学习程序结构和变量声明的基础知识。@Aaron-是的,去做。
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}