我正在编写一个应用程序,我需要一个C函数来返回一个数组。我已经读过C函数直接不能返回数组但是指向数组的指针,无论如何我还是不能让它工作。我正在发送一个包含几个数值的字符串,我必须将它放入一个数组中。
我的代码如下所示,主要功能是:
int main() {
char arr[3] = {0};
char *str = "yaw22test242test232";
foo(arr,3,str);
printf("%d\n",arr[0]);
return 0;
}
我想让foo
函数分别在数组位置0,1和2上返回数字为22,242和232的数组。 foo
函数中的算法在主程序中使用时可正常工作,但不是这种方式。有什么方法可以解决这个问题吗?我究竟做错了什么? foo
函数如下所示:
void foo(char *buf, int count, char *str) {
char *p = str;
int k = 0;
while (*p) { // While there are more characters to process...
if (isdigit(*p)) { // Upon finding a digit, ...
double val = strtod(p, &p); // Read a number, ...
//printf("%f\n", val); // and print it.
buf[1-count-k] = val;
k++;
} else { // Otherwise, move on to the next character.
p++;
}
}
}
答案 0 :(得分:2)
嗯,你在这里超出界限:
buf[1-count-k] = val;
也许您的意思是buf[k] = val;
和支票if( k >= count )
来结束循环。
由于char *buf
通常无法表示大于127的值,因此应使用足够大的整数类型或double,否则从类型double到类型char的赋值buf[*] = val;
,会导致未定义的行为。
答案 1 :(得分:0)
看起来你想要将字符串中的数字提取为double
s,但是你试图将它们存储在char数组中。这甚至都没有编译。
所以,首先,使用适当的缓冲区:
int main() {
double arr[3] = {0};
/* ... */
}
并更新foo()
中的参数声明:
void foo(double *buf, int count,char *str) { ... }
然后解决这个问题:
buf[1-count-k] = val;
你可能想要一些简单的东西:
buf[k++] = val;
最后,您可能希望返回k
,以便调用者有机会知道有多少数字写入数组。所以,foo
看起来像这样:
size_t foo(double *buf, int count,char *str) {
char *p = str;
size_t k = 0;
while (*p) { // While there are more characters to process...
if (isdigit(*p)) { // Upon finding a digit, ...
double val = strtod(p, &p); // Read a number, ...
//printf("%f\n", val); // and print it.
buf[k++] = val;
} else { // Otherwise, move on to the next character.
p++;
}
}
return k;
}
请注意,索引数组的正确类型为size_t
,而不是int
。 size_t
保证足够宽以容纳任何数组的大小,因此如果您希望代码使用任意长的数组,则应使用size_t
来索引数组。
答案 2 :(得分:0)
我建议使用类似矢量的结构而不是数组。已经有很多这方面的实现(参见C的GLib列表)。但是如果你想自己推动自己的尝试,可以试试类似的东西:
typedef struct
{
char** data;
int size;
} str_vector;
您可以动态分配str_vector
及其data
成员,并将其返回。我不会进一步详细介绍,因为互联网上有很多这方面的教程,我相信你可以在几秒钟的时间内在Google / Bing / Whatever中提出:)