0

我正在尝试编写一种方法来删除字符串的第一个字母并将其附加到字符串的末尾,然后附加“ay”。我使用的是链表结构,它可以工作,但不是 100%,我不知道为什么。它有时会做不应该做的事情,但它似乎会随机添加先前单词的部分内容。例如,输入“到底怎么回事”应该是“hatway hetay ellhay siay rongway”的输出,但它给了我“hatway hetwayay ellhayayay silhayayayay rongway”

这是似乎有错误的部分:

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 中。它在手册页中使用的算法,但本质上,如果未清除字符数组 p 并写入较短的字符串,则在迄今为止写入的最长内容的长度之后,才会存在空终止。(这也是 strlen 误导你的原因!)

如果您不喜欢每次都清除 p(您应该这样做),您可以通过附加 a 来欺骗机器,

字符新字符 = 0

每次为 p 赋值之后

于 2012-10-31T05:52:59.950 回答