[英]Function Pointer - variable not initialized
#include <stdio.h>
int Calc(int n1, int n2, int(*func) (int n1, int n2))
{
return func(n1, n2);
}
int Plus(int n1, int n2)
{
return n1 + n2;
}
int Minus(int n1, int n2)
{
return n1 - n2;
}
int main(void)
{
int n1, n2;
int result;
char mark;
printf("입력 : ");
scanf_s("%d", &n1);
printf("choose function : ");
scanf_s("%c", &mark, sizeof(mark));
printf("입력 : ");
scanf_s("%d", &n2);
switch (mark)
{
case '+':
result = Calc(n1, n2, Plus);
case '-':
result = Calc(n1, n2, Minus);
}
printf("%d\n", result);
return 0;
}
我正在用簡單的代碼學習C語言中的函數指針。 我通過使用scanf_s使其初始化了變量結果,但它向我發送了一條錯誤消息,通知我變量結果未初始化。 如何解決此代碼?
您有兩個問題:
1.在scanf_s("%d", &n1);
之后,將'\\n'
留在輸入緩沖區中scanf_s("%d", &n1);
然后將其作為您對scanf_s("%c", &mark, sizeof(mark));
您必須先刪除結尾的換行符,然后才能嘗試使用"%c"
進行讀取。 一個簡單的empty_stdin
函數就可以了,
例如
#include <stdio.h>
void empty_stdin ()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
...
printf("입력 : ");
scanf_s("%d", &n1);
empty_stdin(); /* remove all extraneous chars from stdin */
printf("choose function : ");
scanf_s("%c", &mark, sizeof(mark));
2.您無法在每個switch
盒的末尾添加break
,從而導致自動掉線到下一個switch
盒,您需要,
例如
switch (mark)
{
case '+':
result = Calc(n1, n2, Plus);
break;
case '-':
result = Calc(n1, n2, Minus);
break;
}
綜上所述,您可以執行以下操作:
#include <stdio.h>
void empty_stdin ()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
int Calc(int n1, int n2, int(*func) (int n1, int n2))
{
return func(n1, n2);
}
int Plus(int n1, int n2)
{
return n1 + n2;
}
int Minus(int n1, int n2)
{
return n1 - n2;
}
int main(void)
{
int n1, n2;
int result = 0;
char mark;
printf("입력 : ");
scanf_s("%d", &n1);
empty_stdin();
printf("choose function : ");
scanf_s("%c", &mark, sizeof(mark));
printf("입력 : ");
scanf_s("%d", &n2);
switch (mark)
{
case '+':
result = Calc(n1, n2, Plus);
break;
case '-':
result = Calc(n1, n2, Minus);
break;
}
printf("%d\n", result);
return 0;
}
( 注意:您還必須驗證每個scanf
的返回值 ,以確保有有效的輸入-留給您。也請注意,您可以忽略前導空格 -包括'\\n'
,方法是在格式之前添加一個空格說明符,例如" %c"
,但是不能防止先前輸入的匹配失敗-理想情況下,您應該在每個輸入之后用scanf
empty_stdin()
以防止這種情況,並為下一個輸入准備好輸入緩沖區。)
使用/輸出示例
$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5
您尚未初始化結果變量,您對n1,n2使用了scanf_s,但是對結果沒有執行任何操作,因此編譯器會抱怨
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.