c - 如何从C函数中返回字符数组

标签 c arrays function user-defined-functions return-type

所以我写了一个函数,将十进制数转换成十六进制数。我正在编写一个十六进制函数来进行转换,我将在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
后面返回ahexadecimalchar定义与此冲突。
要解决这个问题,可以在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/

相关文章:

python - Numpy:沿轴应用具有不同索引的输入数组

c++ - 代码只从源文件中读取第一行文本

php - 如何在 javascript/jQuery 中调用文本函数?

c - C代码中的矩阵乘法

c++ - 为什么要在 c/c++ 中直接写一个分号?

arrays - 向后循环数组(从下到上)VBA

R:如何使用函数参数作为变量名的一部分

javascript - 表单成功和表单验证消息的不同功能

c++ - 信号 : Segmentation fault (11) when using Openmpi

c - 如何在C中逐行将文件内容读入结构