c-While循环导致程序出现许多问题


void answerme();
int main() {
char *answer = malloc (MAX_NAME_SZ);
....
printf ("nWould you like to begin? [Y/N]");
fgets (answer, MAX_NAME_SZ, stdin);
answerme();
if(*answer == 'y' || *answer == 'Y'){
getinfo();
printf("nprogram starting now...");
}

else if(*answer == 'n' || *answer == 'N'){
printf("nThank you, program will close now....");
return 0;
}
...
}                 //end of main

void answerme(){                    
char *answer = malloc (MAX_NAME_SZ);
while(*answer !='n' && *answer != 'N' && *answer != 'y' && *answer != 'Y'){
printf("nPlease enter [Y], or [N]");
fgets (answer, MAX_NAME_SZ, stdin);
}
};

这个while循环或整个函数的目的是检查用户是否用y/n而不是另一个随机键回答了这个问题。我希望while循环继续要求用户输入Y/N,直到用户输入为止。但是,由于某种原因,当这个程序运行时,第一步会问你是否想开始这个程序,如果你确实回答了Y,它会出于某种原因告诉你"请输入Y或N",即使你确实输入了正确的答案,然后,当你输入例如"n",甚至任何其他随机字母时,它仍然会让你通过。因此,它似乎注册了输入,但出于某种原因,它仍然要求运行while循环,而不是跳过if(答案==Y)或if(答案=N)。

有人知道发生这种事的原因是什么吗?

此外,一旦用户说"Y"并开始程序,就会有一条消息要求用户输入某些信息,这些信息会被存储到我创建的结构中(代码中没有显示),但有了这个while循环,不知何故会跳过它。如果我去掉while循环,整个程序运行良好,但用户当然可以跳过程序的各个步骤,而无需严格输入我对他的要求。

如果有更好的替代方法可以限制用户只输入我的要求,请一定要启发我,因为在过去的3天里,这一直给我带来问题和头痛。非常感谢。

问题是在函数中设置了一个变量*answer,而在主程序中还有另一个变量。然而,看起来它们应该是相同的变量。

要解决此问题,请仅声明一个,并在两个函数之间共享它。要做到这一点,可以在任何函数外声明它,或者将它从main传递到subfunction。请注意,它应该仅为malloc()一次。

参数传递技术的示例是:

void answerme (char *answer)
{                    
while (*answer !='n'  &&  *answer != 'N'  && 
*answer != 'y' && *answer != 'Y')
{
printf ("nPlease enter [Y], or [N]");
fgets (answer, MAX_NAME_SZ, stdin);
}
}
int main() 
{
char *answer = malloc (MAX_NAME_SZ);
....
printf ("nWould you like to begin? [Y/N]");
fgets (answer, MAX_NAME_SZ, stdin);
answerme(answer);
if (*answer == 'y' || *answer == 'Y')
{
getinfo();
printf("program starting now...n");
}
else
if (*answer == 'n' || *answer == 'N')
{
printf("Thank you, program will close now.n");
return 0;
}
...
}                 //end of main
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10
void answerme();
int main() {
char answer[SIZE]="0";

printf ("nWould you like to begin? [Y/N]");
scanf(" %s",answer);
if((strcmp(answer,"y")==0) || (strcmp(answer,"Y")==0))
{
printf("Answer is yn");
printf("nprogram starting now...");
answerme();
}
else
{
printf("Wrong input..exitingn");
exit(1);
}
return 0;
}
void answerme()
{                    
char answer[SIZE]="0";
do
{
printf("nPlease enter [Y], or [N]");
scanf(" %s",answer);
printf("You entered %sn",answer);
}while((strncmp(answer,"y",1)!=0) && (strncmp(answer,"Y",1)!=0) && (strncmp(answer,"n",1)!=0) && (strncmp(answer,"N",1)!=0));
}

最新更新