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