从C函数返回数组

时间:2015-04-28 11:08:21

标签: c arrays

我正在编写一个应用程序,我需要一个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++;
        }
    }
}

3 个答案:

答案 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,而不是intsize_t保证足够宽以容纳任何数组的大小,因此如果您希望代码使用任意长的数组,则应使用size_t来索引数组。

答案 2 :(得分:0)

我建议使用类似矢量的结构而不是数组。已经有很多这方面的实现(参见C的GLib列表)。但是如果你想自己推动自己的尝试,可以试试类似的东西:

typedef struct
{
    char** data;
    int size;

} str_vector;

您可以动态分配str_vector及其data成员,并将其返回。我不会进一步详细介绍,因为互联网上有很多这方面的教程,我相信你可以在几秒钟的时间内在Google / Bing / Whatever中提出:)