我正在尝试在函数中退出while循环,但我不认为我正在正确地编写指针,c对我来说是新的,在线阅读示例令人困惑。
我很想知道我写错了什么。
int logOn(int *log);
int main(void)
{
int log;
log = 1;
while(log = 1)
{
int logOn(log);
}
while(log = 2)
{
int mainMenu();
}
printf("\ngood bye");
}
int logOn(*par)
{
char p;
printf("would you like to log on (y/n): ");
scanf("%s", &p);
if(p="y")
{
par = 2;
}
else if(p="n");
{
par = 3;
}
else
{
printf("\nError entering command\n")
}
return 0;
}
我已经更新了我的代码并修复了很多人帮助我识别的错误。
现在由于某种原因它会通过我的登录循环两次,如果我按下一个键'y'或'n'
这是我当前的代码看起来像
int logOn(int *log);
int mainMenu(int *log);
int main(void)
{
int log;
log = 1;
while(log == 1)
{
(void) logOn(&log);
}
while(log == 2)
{
mainMenu(&log);
}
printf("\ngood bye");
}
int logOn(int *par)
{
char p;
printf("would you like to log on (y/n): ");
scanf("%c", &p);
if(p == 'y')
{
*par = 2;
}
else if(p == 'n')
{
*par = 3;
}
else
{
printf("\nError entering command\n");
}
return 1;
}
int mainMenu(int *par)
{
printf("\nMain Menu\n");
*par = 3;
return 0;
}
当我不打'y'或'n'
时,这就是它的推出 would you like to log on (y/n): e
Error entering command
would you like to log on (y/n):
Error entering command
would you like to log on (y/n):
答案 0 :(得分:3)
while(log == 1)
它是==
而非=
。
当您处于暂停状态时,您只需将log = 1
分配给1
。然后log
从变量while
中获取1
,该变量隐式转换为log
,这使得true
无限循环。
答案 1 :(得分:3)
logOn函数的参数必须定义如下:
int logOn(int *par){//function body}
while条件的语法必须如下:
while(log == 1)
注意double ==符号。这是必要的,因为单个=符号将导致无限循环。
此外,当您将变量的地址传递给函数时,在函数体内需要一个*运算符,以便在该地址处对值进行推理。
e.g
int logOn(int *par)
{
printf("%p", par); //address par
printf("%d",*par); //value stored at address par
}
希望这有帮助。
答案 2 :(得分:1)
while(log = 1)
while(log = 2)
错误。在c中,=
运算符用于赋值,而不是比较。您设置日志等于1和2。您希望==
运算符进行比较:
while(log == 1)
下一步:
scanf("%s", &p);
错误。 %s
适用于以{0('0')结尾的char
数组。这就是c代表字符串的方式。对于单个字符,您需要
scanf("%c", &p);
下一步:
if(p="y")
您再次滥用分配运算符。此外,您正在比较p
,char
到"y"
,char *
- 字符数组。双引号用于字符串,单引号/撇号用于单个字符。您正在寻找
if(p == 'y')
下一步:
else if(p="n");
与上面相同的错误,加上分号 - ;
不属于那里。可以这么说,这应该会导致下面的else
声明出现编译错误。你想要:
else if(p == 'n')
下一步:
par = 2;
par = 3;
您正在为指针指定整数。你可能意味着
*par = 2;
*par = 3;
下一步:
int logOn(log);
应该是
(void) logOn(&log);
下一步:
int mainMenu();
我不知道mainMenu
是什么,但int
关键字在那里毫无意义。
答案 3 :(得分:1)
您计划中的一些要点。
首先,while(log = 1)
,因为您正在检查日志是否等于1,所以语法应为while(log == 1)
{
}
其次,在调用logOn
函数时,传递日志变量的地址(int logOn(&log)
;)
第三,int logOn(*par)
函数的签名应为int logOn(int *par)
。
第四,"y"
或"n"
表示字符串文字,如果您只想使用单个字符,请使用' y'或者' n',单引号。
第五,要更改指针的值,请使用解引用运算符*
。
您在代码中的行应
*par = 2; (//Content of par equal to 2)
*par = 3;
快乐的节目。