繁体   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