所以我写了一个函数,将十进制数转换成十六进制数。我正在编写一个十六进制函数来进行转换,我将在m a in()中调用它。我需要我的十六进制函数返回十六进制数的字符数组。我在不同的例子中看过youtube视频和其他关于返回字符数组的问题,但我无法在代码中实现。
我一直得到的错误是“十六进制的冲突类型”
#include<stdio.h>
int main()
{
//receiving name from user
char name[50];
printf("Enter your name: ");
scanf("%s", name);
//recieving integer from user
char hex1[32];
int num;
printf("Enter an integer(1-1,000,000) or type x to exit: ");
scanf("%d", &num);
char hex[30];
printf("Hexadecimal: %s\n", hexadecimal(hex1));
}
char hexadecimal(char x[])
{
int quotient;
int temp, i;
i=1;
quotient = x;
char hex2[32];
memcpy(hex2, x, sizeof(hex2));
while (quotient != 0)
{
temp = quotient%16;
if(temp<10)
temp += 48;
else
temp += 55;
hex2[i++] = temp;
quotient = quotient/16;
}
return hex2;
}
最佳答案
在使用之前声明每个标识符
问题中的代码调用hexadecimal
中的main
函数,但尚未声明它。这将导致编译器使用默认声明,其中hexadecimal
返回int
。
后面返回ahexadecimal
的char
定义与此冲突。
要解决这个问题,可以在hexadecimal
之前移动main
的整个定义,或者在main之前放置hexadecimal
的声明。可以使用开始定义的同一行来声明函数,但该行以;
结束(对于声明),而不是以括号{ ... }
中的语句列表结束(对于定义)。
告诉编译器使用现代标准C
二十年来,标准C要求声明函数。请参阅编译器文档以了解如何告诉编译器使用现代C标准。如果您使用的是GCC或Clang,则可以使用命令行开关-std=c17
来请求2017/2018 C标准。
告诉编译器提供警告和错误并予以注意
如果使用GCC或Clang,请使用命令行开关-Wmost
或-Wall
启用许多警告消息,并使用-Werror
将警告变为错误。如果您正在使用另一个编译器,请参阅其文档。
当编译器打印警告消息时,请在继续之前弄清楚它的含义并修复它。
返回字符串,而不是字符
用char hexadecimal(char x[])
声明的函数只返回一个char
。您想要返回一个字符串。字符串是以空字符结尾的字符序列。
字符串由指向其第一个字符的指针引用。因此用于引用字符串的基类型是char *
。您的函数应该声明为char *hexadecimal(char x[])
。(它也可以声明为char *hexadecimal(char *x)
,因为数组参数会自动调整为指针。)
创建要返回的新对象
函数用char hex2[32];
定义数组,并尝试用return hex2;
返回它。这样在函数中定义的对象具有自动存储持续时间,这意味着C实现在函数调用中为其提供内存,并在函数返回时释放该内存。自动对象的地址不应该从其函数返回,因为它的内存不再被保留以供使用(而且指针在技术上变得无效)。
移除char hex2[32];
并改为使用:
char *hex2 = malloc(32 * sizeof *hex2);
if (!hex2)
{
fprintf(stderr, "Error, malloc failed.\n");
exit(EXIT_FAILURE);
}
这将尝试使用
malloc
分配内存。如果分配失败,它将打印一条消息并终止程序。因为它使用标准库中的新例程,所以您应该在程序的开头插入:#include <stdlib.h>
这会分配内存,但不会释放内存。在需要管理内存的大型程序中,应该释放内存。在这种情况下,调用者在处理完内存后,应该释放内存,就像
free(x);
一样,其中x
是一个包含从函数返回的指针值的char *
。用空字符终止字符串
字符串的结尾用空字符标记。在
hexadecimal
函数将所需的字符放入字符串之后,它应该在结尾处放入一个空字符,其中:hex2[i] = '\0';
重要的是要确保在分配的空间中有此字符的空间,始终将其包含在所需空间的计数中。
使用正确的字符值,而不是硬编码常量
对于字符“0”不要使用
48
,对于55
和10之间的差异不要使用A
。这并不是严格遵循C的,也不必要,因为C使代码易于移植。此外,硬编码常量不能传达意图,而使用字符值则可以。更改此代码:if(temp<10)
temp += 48;
else
temp += 55;
致:
if (temp < 10)
temp += '0';
else
temp += 'A' - 10;
这使读者更清楚地知道目的是什么。它仍然不是完全可移植的,因为C标准(5.2.1/3 inthe C17 draft)在字符编码中是not guarantee the characters “A” through “F” have consecutive values(它在数字“0”到“9”中是这样),但它是一个改进。
关于c - 如何从C函数中返回字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58442425/