如何解决C语言中未定义的引用错误?

如何解决C语言中未定义的引用错误?,c,function,scanf,C,Function,Scanf,我对C编程非常陌生,正在学习K&R C编程语言书。我正在尝试编写一个程序,将十六进制数反复转换为十进制数,并希望在代码中使用函数。有一些问题妨碍我理解C。我读过关于它们的文章,但不清楚 我想读取最大长度为4的输入,但据我所知,scanf并不限制长度,尽管char数组的长度为4。所以我尝试用for循环消除非整数字符。这样行吗?从用户那里获取信息的正确方式是什么?我不想使用whilecr=getchar=EOF 当我运行程序时,我收到一条错误消息:未定义对“convert”的引用。我应该如何定义函数

我对C编程非常陌生,正在学习K&R C编程语言书。我正在尝试编写一个程序,将十六进制数反复转换为十进制数,并希望在代码中使用函数。有一些问题妨碍我理解C。我读过关于它们的文章,但不清楚

我想读取最大长度为4的输入,但据我所知,scanf并不限制长度,尽管char数组的长度为4。所以我尝试用for循环消除非整数字符。这样行吗?从用户那里获取信息的正确方式是什么?我不想使用whilecr=getchar=EOF

当我运行程序时,我收到一条错误消息:未定义对“convert”的引用。我应该如何定义函数

我使用代码::block16.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;
}
这是无效的:

scanf("%c", input);
%c格式说明符将只读取一个字符。如果要读取字符串,则需要使用%s。此外,还应在此字段上添加长度修饰符,以指定要读取的最大字符数:

scanf("%4s", input);
您需要将输入元素增大一个,以便为终止的空字节留出空间

此外,您还试图在主函数中定义转换函数。标准C中不支持嵌套函数

您需要将convert的定义移到main之外:

您已经在main函数内部定义了convert-将它移到外部,它将修复错误


另外,为了存储长度为4的scanf结果,您的输入应该是5,因为所谓的C字符串以NULL结尾。例如,当您键入A0CD时,输入中的值将为{'A','0','C','D',0}

1]您不能使用嵌套函数。把它移出身体

2] 这里

printf("Here is the decimal result: %d", convert(input[validLength]));
您正在传递一个char,但转换函数expect的char*。正确:

printf("Here is the decimal result: %d", convert(input));
3] %c说明符用于字符,请使用%s或更好的说明符来读取%4s的字符数。不要忘记检查返回值

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

int convertchar hex[]{…}将其移到main之外。convertinput[validLength]->convertinputscanf%c,input;->扫描频率%4c,输入;input[j]>48->input[j]>='0'@KubilayCanDEMİR我测试过了,它确实有效,也许你的实现有问题。但正如BLUEPIXY在他的代码中使用的那样,它在ctype.h中为您提供。
if(scanf("%4s", input) != 1)
{
    // Fail
}