在这段“联系人管理系统”的代码中,我很难获得一条线的预期输出。基本上,在您添加新联系人的这一部分中,它会要求您“请输入公寓#”,如下所示:
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;
}
现在,根据我的任务,你应该输入单词(而不是数字,得到它?)“bison”,它会产生输出:
* INVALID INTEGER *请输入一个整数:
对于上下文,这部分工作非常好。但是,然后指示您输入整数“-1200”,然后应该显示提示
*无效公寓号码*请输入正数:
正是这个部分我有问题,因为简单地说,我不知道把它放在哪里,无论是在if语句中还是在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()代码的人,在这里:
getInt()
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()
功能非常脆弱。用户只输入一次非整数值是什么意思?在接收特定类型的输入时,通常最好不断循环直到您收到有效输入(或用户取消输入),并始终防止输入不符合您的预期(例如当猫踩到键盘时) ...)
如果使用正确,可以使用scanf
。这意味着您每次都要负责检查scanf
的返回。你必须处理三个条件
(return == EOF)
用户通过按Ctrl + d生成手动EOF
取消输入(或在Windows Ctrl + z上,但请参阅CTRL+Z does not generate EOF in Windows 10 (early versions));(return < expected No. of conversions)
发生匹配或输入故障。对于匹配失败,您必须考虑输入缓冲区中剩余的每个字符。 (在输入缓冲区中向前扫描并丢弃字符,直到找到'\n'
或EOF
);最后(return == expected No. of conversions)
表示读取成功 - 然后由您来检查输入是否满足任何其他标准(例如正整数,正浮点,在所需范围内等)。将它与你的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 */
}
(注意:函数返回的值是验证函数是否成功(1
的返回)或用户是否用EOF
(0
的返回)取消,整数值通过指针value
可供调用者使用)
辅助函数empty_stdin()
简单地说:
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
有很多方法可以将getint()
放在一起以根据您的需要进行定制,只要您正确处理上述所有三种情况,您就可以随心所欲地进行操作。