在C中操纵字符串

时间:2012-10-31 05:44:28

标签: c strlen strcpy strcat

我正在尝试编写一个方法来删除字符串的第一个字母,并将其附加到字符串的末尾,并使用" 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中有一个值。"我的其余代码工作正常,除了这个让我疯狂的小错误!有什么想法吗?

2 个答案:

答案 0 :(得分: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'字符,因此没有办法到达字符串的末尾。

答案 1 :(得分:0)

在我看来,p和e并没有被彻底清除,而strcpy只是在需要时将尽可能多的字符覆盖到p中。它在man手册中使用的算法,但基本上如果没有清除char-array p并且写入更短的字符串,则null终止将在到目前为止写入的最长内容的长度之后才存在。 (这就是strlen误导你的原因!)

如果你不想每次都清楚p(你应该这样做),你可以通过添加一个来愚弄机器,

char newChar = 0

每次为p

分配值后