我是C新手,需要您的想法帮助我从以下函数返回结果数组:
void getBase(int n, int b)
{
const size_t SIZE = 32;
char arr[32+1]={0}; int digits=SIZE, i;
char* ptr = arr;
while (n > 0)
{
int t = n%b;
n/=b;
arr[--digits] = numbers[t];
}
while ( *ptr == '\0') ptr++;
// NEED To return a ref to `ptr`
}
我的解决方案:
void getBase(int n, int b, /*send some array as a parameter*/ char* str)
{
const size_t SIZE = 32;
char arr[32+1]={0}; int digits=SIZE, i;
char* ptr = arr;
while (n > 0)
{
int t = n%b;
n/=b;
arr[--digits] = numbers[t];
}
while ( *ptr == '\0') ptr++;
/* and use strcpy ... perhaps memcpy if non-string )*/
strcpy(str, ptr);
}
我需要进一步的想法......
感谢。
答案 0 :(得分:4)
您的解决方案看起来很好。
相反,您根本不需要本地arr
数组。您可以直接写入str
:
编辑:清理并正常工作。
const char numbers[] = "0123456789abcdef";
void getBase(int n, int b, char* str)
{
const size_t SIZE = 32;
int digits=SIZE;
while (n > 0)
{
int t = n%b;
n/=b;
str[--digits] = numbers[t];
}
int length = SIZE - digits;
memmove(str,str + digits,length);
str[length] = '\0';
}
您必须确保str
足够大,以避免数组溢出。
int main(){
char str[33];
getBase(684719851,10,str);
printf(str);
return 0;
}
<强>输出:强>
684719851
答案 1 :(得分:1)
正如其他提到的,常见的解决方案是分配一个数组,返回一个指向它的指针。请确保在调用者函数中释放它。
如果您知道(在编译时)数组的大小,您可以创建一个包含数组的结构,并返回结构。请注意,它会将数组推送到堆栈,并可能使程序变慢。如果它是一个非常大的数组,你甚至可能会出现堆栈溢出。
答案 2 :(得分:0)
如果要返回长度为n的数组,首先应使用malloc创建数组,然后返回指针。 E.g。
char *arr = malloc(n*sizeof(char));
//now arr points to an array, use it as you like
return arr;
确保将函数的返回类型设置为char *。您可以为任何类型的数组执行相同的操作 - 只需确保相应地更新所有类型。