如何将转换为char数组的int返回到main以显示它



我的怀疑如下:

1:如何从函数'fun'发送'str',以便我可以在主函数中显示。

2:返回类型在代码中是否正确?

2:当前代码正在显示一些不同的输出。

char * fun(int *arr)
{
    char *str[5];
    int i;
    for(i=0;i<5;i++)
    {
        char c[sizeof(int)] ;
        sprintf(c,"%d",arr[i]);
        str[i] = malloc(sizeof(c));
        strcpy(str[i],c);
    }
    return str;
}
int main()
{
    int arr[] = {2,1,3,4,5},i;
    char *str = fun(arr);
    for(i=0;i<5;i++)
    {    
        printf("%c",str[i]);
    }
    return 0;
}

如何从函数'有趣的'发送'str',以便我可以在主函数中显示。

这就是方式:

char* str = malloc( size );
if( str == NULL ) {
    fprintf( stderr,"Failed to mallocn");
}
/* Do stuff with str, use str[index], 
 * remember to free it in main*/
free(str);

,返回类型在代码中是否正确?

不,可能是您需要返回的char **。

当前代码正在显示一些不同的输出。

考虑解释您要做什么/为什么要做?您写的方式似乎完全弄乱了我。您正在传递整数数组,但不会长度。乐趣()应该如何知道数组的长度?另一个问题是Fun中的一系列指针。

您不能将int写成char(请参阅两个大小)。因此,我改用char数组。但是,我不确定这是否是您想做的(可能是一种快速而肮脏的方式):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** 
fun(int *arr, int size)
{
    char **str = malloc( sizeof(char*)*size );
    if( str == NULL ) {
        fprintf( stderr, "Failed mallocn");
    }
    int i;
    for(i=0;i<5;i++) {
        str[i] = malloc(sizeof(int));
        if( str == NULL ) {
              fprintf( stderr, "Failed mallocn");
        }
        sprintf(str[i],"%d",arr[i]);
    }
    return str;
}
int 
main()
{
   int arr[] = {2,1,3,4,5},i;
   char **str = fun(arr, 5);
   for(i=0;i<5;i++) {    
       printf("%sn",str[i]);
       free(str[i]);
   }
   free(str);
   return 0;
}

我对您的代码进行了这些更改以使其正常工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **fun(int *arr)
{
    char **str = malloc(sizeof(char *) * 5);
    int i;
    for(i = 0; i < 5; i++) {
        if ((arr[i] >= 0) && (arr[i] <= 9)) {
            char c[2] ;
            sprintf(c, "%d", arr[i]);
            str[i] = (char *) malloc(strlen(c) + 1);
            strcpy(str[i],c);
        }
    }
    return str;
}
int main()
{
    int arr[] = {2, 1, 3, 4, 5}, i;
    char **str = fun(arr);
    for(i = 0; i < 5; i++) {
        printf("%s", str[i]);
        free(str[i]);
    }
    printf("n");
    free(str);
    return 0;
}

输出

21345

我添加了一张检查,以确保arr[i]是一个数字号码。此外,将指针返回堆栈变量将导致不确定的行为,因此我更改了代码以分配一系列字符串。我不检查malloc调用的返回值,这意味着由于NULL指针参考。

可能会崩溃。

此解决方案与其他解决方案不同,因为它试图根据预期的用法来回答您的问题。

如何从函数'有趣的'发送'str',以便我可以在主函数中显示。

首先,您需要定义一个将指针返回数组的函数。

char (*fun(int arr[]))[]

分配可变长度字符串不会给您任何东西。64位未签名的INT所需的最长字符串是20位数字。您需要的只是分配5个元素的数组,分别为2个字符。您可以调整长度以适合您的需求。该样本假定1位数字和1个无效字符。注意分配仅完成一次。您可以选择使用21个长度(20位数字和1个null)。

有关此处的值与包括终结器在内的数字数量有关的可读性,我将定义一个可以修改以适合您需求的宏。

#define NUM_OF_DIGITS 3

然后,您可以在整个代码中使用此宏。

char (*str)[NUM_OF_DIGITS] = malloc(5 * NUM_OF_DIGITS);

最后,可以声明main()中的接收变量并分配返回的数组。

char (*str)[NUM_OF_DIGITS] = fun(arr);

您的完整代码应该看起来像:

代码

char (*fun(int arr[]))[]
{
    char (*str)[NUM_OF_DIGITS] = malloc(5 * NUM_OF_DIGITS);
    int i;
    for(i=0;i<5;i++)
    {
        snprintf(str[i],NUM_OF_DIGITS,"%d",arr[i]); //control and limit to single digit + null
    }
    return str;
}
int main()
{
    int arr[] = {24,1,33,4,5},i;
    char (*str)[NUM_OF_DIGITS] = fun(arr);
    for(i=0;i<5;i++)
    {
        printf("%s",str[i]);
    }
    free(str);
    return 0;
}

输出

2413345

使用此方法,您只需要释放一次分配的内存。

相关内容

  • 没有找到相关文章

最新更新