[英]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.