0

文字列の最初の文字を削除し、その後に「ay」を追加して文字列の最後に追加するメソッドを作成しようとしています。リンクリスト構造を使用していますが、機能しますが、100%ではないため、理由がわかりません。時々想定されていないことをしますが、前の単語の一部をランダムに追加しているようです。たとえば、「何が間違っているか」という入力は、「hatway hetay ellhay siay rongway」の出力になるはずですが、「hatway hetwayayellhayayaysilhayayayayrongway」という結果になります。

バグがあるように見える部分は次のとおりです。

typedef struct  wordNodeType
{
    char word[MAX_CHARS];
    struct wordNodeType *next;// pointer to next node
}WordNode;

struct wordNodeType *tempP;

WordNode* translateWord (WordNode* nextWord)
{
    strcpy(e,nextWord->word);
    strcpy(p, &e[strlen(e)-(strlen(e)-1)]);// remove first letter
    // remove newline char if there
    if(p[strlen(p)-1] == '\n')
        p[strlen(p)-1] = '\0';
    p[strlen(p)] = e[0];//move first char of e to last char of p ***the problem seems to happen here
    strcat(p,"ay");// append "tay" to end
    strcpy(tempP->word,p);
    return tempP;
}

ノードにメモリが割り当てられていますが、ノードには「word」の値があります。私のコードの残りの部分は、私を夢中にさせているこの小さなバグを除いて、正常に機能します!何かご意見は?

4

2 に答える 2

3

これを修正するために行う必要のある小さな変更があります。変更されたコードは次のとおりです。

WordNode* translateWord (WordNode* nextWord)
{
    strcpy(e,nextWord->word);
    strcpy(p, &e[strlen(e)-(strlen(e)-1)]);// remove first letter
    // remove newline char if there
    if(p[strlen(p)-1] == '\n')
        p[strlen(p)-1] = '\0';
int sizeofP = strlen(p);   /////Change Here
    p[strlen(p)] = e[0];//move first char of e to last char of p ***the problem seems to happen here
p[sizeofP + 1] = '\0';  /////Change Here
    strcat(p,"ay");// append "tay" to end
    strcpy(tempP->word,p);
    return tempP;
}

問題は、の最後に最初の文字を書き込んだときにp、文字を上書きした'\0'ため、文字列の最後に到達する方法がなかったことです。

于 2012-10-31T05:58:25.383 に答える
0

pとeが完全にクリアされていないように見え、strcpyは必要な数の文字をpに上書きしているだけです。マニュアルページで使用されているアルゴリズムですが、基本的にchar-array pがクリアされず、短い文字列が書き込まれる場合、これまでに書き込まれた最長のものの長さが終了するまでnull終了は存在しません。(これが、strlenがあなたにも誤解を与える理由です!)

毎回pをクリアしたくない場合は(どちらを実行する必要がありますか)、aを追加するだけでマシンをだますことができる場合があります。

char newChar = 0

pに値を割り当てるたびに

于 2012-10-31T05:52:59.950 に答える