![](/img/trans.png)
[英]How can I fix the swapBack function to get the result I intended?
[英]How would I fix this if statement in C to get it working as intended?
在“联系人管理系统”的这段代码中,我很难获得一行的预期输出。 基本上,在这一部分中,当您添加新联系人时,它会要求您“请输入公寓编号”,如下所示:
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在Windows 10(早期版本)中不会生成 (return == EOF)
来取消输入; (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()
放在一起以根据需要进行调整,只要您能正确处理上述所有三种情况,就可以随意使用任意方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.