如何将转换为 char 数组的 int 返回到 main 以显示它
Posted
技术标签:
【中文标题】如何将转换为 char 数组的 int 返回到 main 以显示它【英文标题】:How to return a int converted to char array back to main for displaying it 【发布时间】:2017-07-29 11:41:57 【问题描述】:我的疑惑如下:
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;
【问题讨论】:
您创建了一个指向字符的指针数组,并为它们应该指向的所有地址分配了空间。返回时,数组本身就消失了。为 5 个地址分配的内存仍然完好无损。 "返回时,数组本身就没有了",你能解释一下它的含义吗? 并将其传递给 main 后,'str' 是否访问相同的地址?str
变量是一个指向字符的数组。当函数终止时,它就消失了。他们指向的字符串仍然存在,因为它们是malloc
ed。
【参考方案1】:
如何从函数“fun”发送“str”,以便我可以在主函数中显示它。
就是这样:
char* str = malloc( size );
if( str == NULL )
fprintf( stderr,"Failed to malloc\n");
/* Do stuff with str, use str[index],
* remember to free it in main*/
free(str);
代码中的返回类型是否正确?
不,可能 char** 是您需要返回的那个。
当前代码显示一些不同的输出。
考虑解释您想要做什么/为什么要做什么?你写的方式,在我看来完全是一团糟。您正在传递整数数组,但不是它的长度。 fun() 应该如何知道数组的长度?另一个问题是 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 malloc\n");
int i;
for(i=0;i<5;i++)
str[i] = malloc(sizeof(int));
if( str == NULL )
fprintf( stderr, "Failed malloc\n");
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("%s\n",str[i]);
free(str[i]);
free(str);
return 0;
【讨论】:
我想在传递给主函数后显示字符串。我也应该传递大小,不好的做法。【参考方案2】:我对您的代码进行了这些更改以使其正常工作:
#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
指针引用而崩溃。
【讨论】:
谢谢先生,我现在明白了。【参考方案3】:此解决方案与其他解决方案的不同之处在于它尝试根据预期用途回答您的问题。
如何从函数'fun'发送'str',以便我可以在主函数中显示它。
首先,您需要定义一个返回数组指针的函数。
char (*fun(int arr[]))[]
分配可变长度的字符串不会给您带来任何好处。 64 位无符号整数所需的最长字符串是 20 位。您只需要分配一个由 5 个元素组成的数组,每个元素长 2 个字符。您可以根据需要调整长度。此示例假定 1 个数字和 1 个空字符。请注意,分配只进行一次。您可以选择使用 21 的长度(20 位数字和 1 个空值)。
为了便于阅读,此处的哪些值与包括终止符在内的位数相关,我将定义一个宏,您可以根据需要对其进行修改。
#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
使用这种方法,您只需要释放一次分配的内存。
【讨论】:
64 位无符号整数长度可以是 20 位:36893488147419103232。 1 : 先生,char (*str)[2] 和 char *str[2] 有什么区别? 如果我想通过 int arr[] = 24,1,33,4,5,那么如何在 snprintf 函数中更改大小。 snprintf(str[i],3,"%d",arr[i] ) 没有给出正确的输出char (*str)[2]
将 str
声明为指向 2 个字符的数组的指针,而 char *str[2]
将 str
声明为指向 char 的 2 个指针的数组。请注意,声明不限制您可以在其中拥有的记录数量。分配的内存决定了记录的数量。像任何指针一样,必须注意不要访问超出分配的内容。以上是关于如何将转换为 char 数组的 int 返回到 main 以显示它的主要内容,如果未能解决你的问题,请参考以下文章