簡體   English   中英

如何解決C中未定義的參考錯誤?

[英]how to solve undefined reference error in C?

我是C語言編程和K&R C編程語言書籍的新手。 我正在嘗試編寫一個程序,將十六進制數反復轉換為十進制數,並想在我的代碼中使用一個函數。 有一些問題使我無法理解C。我已經閱讀了有關它們的內容,但不清楚。

我想讀取最大長度為4的輸入,但是據我了解,盡管char數組的長度為4,但scanf()並沒有限制長度。因此,我嘗試使用for循環消除非整數字符。 這個可以嗎? 從用戶那里獲取輸入的正確方法是什么? 我不想使用while((cr=getchar())!=EOF)

當我運行程序時,我收到一條錯誤消息:“對'convert'的未定義引用”。 我應該如何定義功能?

我使用Code :: Blocks 16.01和MinGW。

這是我的嘗試:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

#define LENGTH 4

int convert (char hex[]);
int result,validLength,j;
char input[LENGTH];

int main(){

    while(1){

        printf("Please enter valid hexadecimal number %d length:",LENGTH);
        scanf("%c", input);  //reading to char array

        for(j=0;j<LENGTH;j++)   // buffer
            if(input[j] > 48 && input[j] < 58)
                validLength++; 


        printf("Here is the decimal result: %d", convert(input[validLength]));

        validLength=0;

    }

    int convert(char hex[]){

        int t;

        for(t=0; t < validLength; t++)
            result= result+ hex[t]*(pow(16,(validLength-t)));

        return result;

    }

    return 0;
}

1]您不能具有嵌套功能。 將其移出身體。

2]這里

printf("Here is the decimal result: %d", convert(input[validLength]));

您正在傳遞一個char ,但是convert函數的期望值為char* 正確:

printf("Here is the decimal result: %d", convert(input));

3] %c說明符用於字符的說明符,請使用%s並更好地使用多少個字符來讀取%4s 不要忘記檢查返回值,例如

if(scanf("%4s", input) != 1)
{
    // Fail
}

這是無效的:

scanf("%c", input);

%c格式說明符將只讀取一個字符。 如果要讀取字符串,則需要使用%s 另外,您應該在此字段上放置一個長度修飾符,以指定要讀取的最大字符數:

scanf("%4s", input);

您需要使input一個元素,以便為終止的空字節留出空間。

另外,您試圖在main函數中定義您的convert函數。 標准C不支持嵌套函數。

您需要將convert的定義移到main之外:

int convert (char hex[]);
int result,validLength,j;
char input[LENGTH+1];

int convert(char hex[]){

    int t;

    for(t=0; t < validLength; t++)
        result= result+ hex[t]*(pow(16,(validLength-t)));

    return result;

}

int main(){

    while(1){

        printf("Please enter valid hexadecimal number %d length:",LENGTH);
        scanf("%4s", input);  //reading to char array

        // initialize validLength, otherwise you increment an uninitialized value
        validLength = 0;
        for(j=0;j<LENGTH;j++)   // buffer
            if(input[j] > 48 && input[j] < 58)
                validLength++; 

        // null terminate after the invalid characters
        input[validLength] = 0;

        printf("Here is the decimal result: %d", convert(input));

        validLength=0;

    }

    return 0;
}

您已經在main函數內部定義了convert將其移至外部並修復了錯誤。

另外,為了存儲長度為4的scanf結果,您的input應為5,因為所謂的C字符串以NULL終止。 (例如,當您輸入A0CD時,輸入中的值將為{'A', '0', 'C', 'D', 0}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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