2

urlTokenerデータ構造の 1 つのメンバーが型の配列でchar*あり、もう 1 つのメンバーが 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

コピー コンストラクタ、デストラクタ、または代入演算子を実装していません。

値で返すため、コピー コンストラクターは onreturn details;で呼び出されますが、既定のコンストラクターは浅いコピーしか行わないため、フィールドchar* theArray[256];は適切にコピーされません。

于 2012-04-27T09:40:57.993 に答える