[英]passing a pointer through a function c
我试图退出一个函数中的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):
while(log == 1)
是==
not =
。
在一段时间内写入log = 1
它只是将1
分配给log
。 然后while
从变量log
获取1
,该变量被隐式转换为true
,这使得while
无限循环。
logOn函数的参数必须定义为:
int logOn(int *par){//function body}
而且while条件的语法必须如下:
while(log == 1)
请注意双==符号。 这是必要的,因为单个=符号将导致无限循环。
此外,当您将变量的地址按原样传递给函数时,函数主体内在其前面需要*运算符,以便引用该地址处的值。
例如
int logOn(int *par)
{
printf("%p", par); //address par
printf("%d",*par); //value stored at address par
}
希望这可以帮助。
while(log = 1)
while(log = 2)
错误。 在c中, =
运算符用于赋值,而不是比较。 您正在此处设置日志等于1和2。 您需要==
运算符进行比较:
while(log == 1)
下一个:
scanf("%s", &p);
错误。 %s
用于以零('\\ 0')结尾的char
数组。 这就是c表示字符串的方式。 对于单个字符,您想要
scanf("%c", &p);
下一个:
if(p="y")
您再次滥用赋值运算符。 另外,您正在将一个p
,一个char
与一个"y"
,一个char *
-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
关键字在那里毫无意义。
程序中的一些要点。
首先, while(log = 1)
,因为您正在检查log是否等于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;
编程愉快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.