2

我试图从一个名为的函数返回一个数据结构,urlTokener其中一个成员是类型数组,另一个成员char*是 int。当我在函数中打印数组的值时,urltokener我得到了正确的类型,但是我看到在使用返回的数据结构的主函数中,数组不包含正确的值,因为输出不正确(不是与函数中的相同)。似乎该函数没有正确返回数据结构。您能否检查并说出我在以下代码中做错了什么?

#include <string.h>
#include <stdio.h>

struct tokenDetail
{
    char* theArray[256];

    int sizeOfArray;
};


tokenDetail urlTokener(const char *,char* );

void main()
{
    // String to be splitted.
    const char* url="/v1/AUTH_abb52a71-fc76-489b-b56b-732b66bf50b1/images?limit=1000&delimiter=/&format=xml"  ;

    tokenDetail newdetails;
    newdetails=urlTokener(url,"?");
    for (int i=0;i<newdetails.sizeOfArray;i++)
    {
        printf("This is in main where size is %d  and the value %s\n",newdetails.sizeOfArray,newdetails.theArray[i]);
    }
}

tokenDetail urlTokener(const char* urlLine,char* delimiter)
{
    char urlArray[256];
    strncpy(urlArray, urlLine, sizeof(urlArray));
    tokenDetail details;
    unsigned int index = 0;
    details.theArray[index] = strtok(urlArray, delimiter);

    while(details.theArray[index] != 0)
    {
        printf("This is in function %s\n",details.theArray[index]);
        ++index;
        details.theArray[index] = strtok(0, delimiter);
    }
    for (int i=0;i<index;i++)
    {
        printf("This is in function 2nd time %s\n",details.theArray[i]);
    }
    details.sizeOfArray=index;
    return details;
}

请注意:我是为 c++ 做的,但我不允许(给我这个任务的人)使用命名空间 std 和库字符串。这就是代码类似于 C 的原因。由于这个限制,我很困惑是标记它 C 还是 C++。所以我在 c 和 c++ 中都标记了它。也许你可以自己决定。

4

3 回答 3

3

您正在使用从返回的指针填充数组strtok,而这些指针又是指向您urlArray的局部变量的指针,一旦您从函数返回,该局部变量就不再存在。

这是 C 还是 C++?你已经设置了两个标签,解决方案是不同的。在 C++ 中,显而易见的解决方案是将char*in tokenDetail替换为std::string. 在 C 中,它有点复杂。您已在结构中动态分配字符串(使用非标准但广泛可用strdup的),并要求客户端释放它们。这里通常的解决方案是返回一个指向动态分配的指针TokenDetail,以及一个freeTokenDetail客户端需要在返回的指针上调用的函数。这使您可以完全自由地进行分配和释放。(实际上,通常的解决方案是只向 TokenDetail客户提供前向声明,并提供他们必须调用以访问其元素的函数。)

于 2012-04-27T10:09:29.237 回答
2

这里的问题不在于它tokenDetail不需要任何手写的复制构造函数、析构函数或赋值运算符。urlArray问题是当你离开时局部变量被破坏urlTokener(),所以元素指向的位置details.theArray变得无效。而且,当然,返回的tokenDetail也是如此,它是它的副本。

于 2012-04-27T10:09:03.947 回答
0

您没有实现复制构造函数、析构函数或赋值运算符。

因为您按值返回,所以调用了复制构造函数return details;,但默认构造函数只进行浅拷贝,因此char* theArray[256];无法正确复制该字段。

于 2012-04-27T09:40:57.993 回答