簡體   English   中英

功能指針-變量未初始化

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM