0

宿題の for ループを使用して malloc を使用してメモリを割り当てる際に問題が発生しています。以下は、char 配列と char ポインター配列を受け取り、char 配列内のトークンの数を返すコンストラクターのコードです。

コンストラクターは char 配列を調べ、空でない最初の文字 (最初のトークンの先頭) までスキップしてから、その文字のインデックスを出力する必要があります。次に、文字列内の次の空の文字 (トークンの末尾) を見つけ、そのインデックスを出力する必要があります。その後、トークン内の文字数を計算し、malloc を使用してポインタ配列にメモリを割り当てます。教授から memcpy を使用してトークンをポインター配列にコピーするように言われました。次に、プログラムはポインター配列を出力します。ここにコードがあります

#include <iostream>
using namespace std;


int parseCommandLine(char cline[], char *tklist[])
{
    int lineLength = strlen(cline);
    int tknCount = 0;
    int tknStart;
    int tknEnd;
    int tknLength;
    int tknIndex;
    bool check;
    cout<<cline<<":"<<lineLength<<endl;
    if(cline[0]==0)
    {
        check = false;
    }
    else
    {
        check = true;
    }
    for(int j=0; j<=lineLength; j++)
    {
        if (isspace(cline[j]) == false && check==false)
        {
            cout<<j<<endl;
            check = true;
            tknStart = j;
        }

         else if(j==0 && check==true)
        {
            cout<<j<<endl;
            tknStart = j;
        }
        else if (check==true && (isspace(cline[j]) || j==lineLength))

        {
            cout<<--j<<endl;
            check = false;
            tknCount++;
            tknIndex = tknCount - 1;
            tknEnd = j;
            tknLength = tknEnd-tknStart;
            tklist[tknIndex] = (char *) malloc(tknLength +1);
            memcpy(tklist + tknIndex,cline + tknStart, tknLength);
            cout<<tklist<<endl;
         }
    } 
    cout<<"There are "<<tknCount<<"tokens in this line.\n"<<endl;
    tknCount = 0;
    return tknCount;
}

コンストラクターを実行すると、トークンのエンドポイントが正しく識別されますが、最初のメモリ位置のみが出力されるため、malloc がループを受け入れていないように見えます。とても奇妙です、できれば助けてください。

編集main():これはコメントに基づく簡単なものです:

int main ()
{
    char * out[6] = {0};
    char cline[] = "new_sensor_node SN42 42 3.57 5.0 7";
    parseCommandLine(cline, out);
    return 0;
}

これを実行した結果は次のとおりです。

$ ./a.out 
new_sensor_node SN42 42 3.57 5.0 7:34
0
14
0x7fffd3762c70
16
19
0x7fffd3762c70
21
22
0x7fffd3762c70
24
27
0x7fffd3762c70
29
31
0x7fffd3762c70
33
33
0x7fffd3762c70
34
There are 6tokens in this line.

反復ごとに同じアドレスが出力されることに注意してください。

リクエストに応じて、ここに入力コードがあります

ifstream infile;
char line[MAX_CMD_LINE_LENGTH] = {0};
char *tokenList[MAX_TOKENS_ON_A_LINE];

int main()
{
infile.open("p4input.txt", ios::in);
if(infile.fail())
{
    cout<<"The input file has failed to open. Program will now terminate."<<endl;
    return 0;
}
else
{
    infile.getline(line,MAX_CMD_LINE_LENGTH);
    parseCommandLine(line, tokenList);
    system("pause");
    return 0;
}
}

ヘッダー内

#define MAX_CMD_LINE_LENGTH 256
#define MAX_TOKENS_ON_A_LINE 30
4

1 に答える 1

0

tklistポインタの配列です。オンライン

tklist[tknIndex] = (char *) malloc(tknLength +1);

配列の要素にポインタを割り当てていますtklist[]tklist自体は変わらない!その要素のみに値が割り当てられます。したがって、cout<<tklist<<endl;常に実行すると、tklistそれが指しているアドレスが出力されます。

メイン プログラムの別のもの*tokenListが初期化されていないため、任意のアドレス (0x7fffd3762c70) を指しています。

*tokenList呼び出す前に main() で一度だけメモリを割り当てparseCommandLine(line, tokenList);、 でのみ出力cout<<tklist+tknIndex<<endl;することをお勧めしますparseCommandLine()

于 2013-06-13T12:24:39.120 に答える