0

以下は、トークン化を行うプログラムで次のトークンを取得するための関数です。それは現在機能していますが、私の教授が求めているものに対してそれが正しいかどうかはまだわかりません。一番上のコメントセクションを見ると、彼は「リターントークン用のスペースは動的に割り当てられるべきだ」と言っています。

私はmallocを使用する必要があると聞いたときはいつでも、mallocを使用せずにそれを実行しました。私はそれを考えるのは正しいですか?

/*
 * TKGetNextToken returns the next token from the token stream as a
 * character string.  Space for the returned token should be dynamically
 * allocated.  The caller is responsible for freeing the space once it is
 * no longer needed.
 *
 * If the function succeeds, it returns a C string (delimited by '\0')
 * containing the token.  Else it returns 0.
 *
 * You need to fill in this function as part of your implementation.
 */
char *TKGetNextToken(TokenizerT *tk) {
char *sPtr, *tPtr, *delim, *temp = NULL, *ret = NULL;

sPtr = tk->sepr; //pointer to the separators

tPtr = tk->ts;
temp = tPtr;

while (tPtr[0] != '\0') //Scan tokenstream
{
    delim = tk->sepr;
    while (delim[0] != '\0') //scan separator stream 
    {
        if (*tPtr == *delim) //Matched with a separator
        {
            if (tPtr == temp) //Check if beginning of the tokenstream
            {
                //then skip over this character.
                temp++;
                break; //Break loop because it may skip checking a char with a prev delim.
            }
            else
            {
                //Cut off current position with null character and pass over it.
                *tPtr = '\0';
                tPtr++;

                if((ret = malloc(sizeof temp) + 1 * sizeof(char)) != NULL) //add 1 for null character '\0'
                    strcpy(ret, temp);

                tk->ts = tPtr; //In position for next token.

                return ret;
            }
        }
        else
        {
            delim++; //Go to next separator.
        }

    }

    tPtr++; //Go to next character.
    count++;
}

if((ret = malloc(sizeof temp) + 1 * sizeof(char)) != NULL) //add 1 for null character '\0'
    strcpy(ret, temp);

tk->ts = tPtr;
return ret;
}

編集:それで私はそれを修正したと思いますが、私が行ったようにmallocを使用して、それはポインタアドレスにスペースを割り当てるだけで、トークン全体を割り当てないのではないでしょうか?

4

1 に答える 1

2

これは可能な実装ですが、教授が求めている実装ではありません。教授は、メモリを割り当ててトークンをそこにコピーしてから、割り当てられたメモリへのポインタを返すように求めています。

于 2012-09-19T04:56:02.863 に答える