我必须告诉你,我已经搜索过该网站和其他网站,但我无法解决我的问题。我正在做一个适用于某些列表的程序。代码将第二个列表中的值复制到第一个列表,条件是:列表2的当前值必须小于列表1中的值。如果此条件为真,则复制该值。但那不是重点。我创建了一个名为GetExitValue()
的函数,它在main的末尾获取用户的输入是否继续。这就是问题所在。当我在main中调用该函数(在一段时间内)时,即使我插入n
(否),它也会继续运行该程序。你能告诉我我做错了什么吗?非常感谢你们!
这是我的代码简化。
int main(){
do{
.
.
.
.
printf("\nProgram finished. Do you wish to re-execute the program? \n\nPress y/Y (Yes) to continue. Press n/N (No) to exit. ");
}
while(GetExitValue() == 'y' || 'Y' ); // **Problem here!!**
return 0;
}
char GetExitValue(){
char exit_value;
scanf(" %c", &exit_value);
while(exit_value != 'y' && exit_value != 'n' && exit_value != 'Y' && exit_value != 'N'){
printf("Value incorrect. insert y or n!!\n");
scanf(" %c", &exit_value);
}
return exit_value;
}
答案 0 :(得分:2)
这部分:
while(GetExitValue() == 'y' || 'Y' ); // **Problem here!!**
你正确发现的可能不做你的意思。此始终为“true”,因为“Y”(ASCII中不为0)始终为“true”。
你在代码中确实有这个:while (condition || 1)
这可能很有用,但在这种情况下不行。
你可能是这个意思:
.
.
// run GetExitValue() only once...
char gev = GetExitValue();
}
while(gev == 'y' || gev == 'Y' );
我只想指出你可以这样做:
.
.
}
while(GetExitValue()); // no need to store value!
如果只有当用户不希望它再次运行时你改变GetExitValue()
才能返回0:
char GetExitValue(){
char exit_value;
scanf(" %c", &exit_value);
while(exit_value != 'y' && exit_value != 'n' && exit_value != 'Y' && exit_value != 'N'){
printf("Value incorrect. insert y or n!!\n");
scanf(" %c", &exit_value);
}
return exit_value == 'Y' || exit_value == 'y'; //evaluates to 1 if true
}
它可能会更干净,您可以将其名称更改为shouldRunAgain()
,根据我的个人喜好,这可以提供更多信息:)
答案 1 :(得分:0)
while表达式评估为:
while( ( GetExitValue() == 'y' ) || 'Y' );
所以表达式总是正确的,因为 any或true == true 。
答案 2 :(得分:0)
你的问题在这里 -
while(GetExitValue() == 'y' || 'Y' );
'Y'部分将始终为真,因为在C中,任何非零(false)的都是真的。 “Y”的ASCII值不为零,因此,while条件将始终返回true。
你应该做的就是这个 -
`char x=GetExitValue();
while(x == 'y' || x=='Y' );`