基本上,我的程序使用链接列表向机器人发出命令。我正在使用strcpy()
将命令复制到链接列表节点结构中,但是它在末尾添加了多余的字符(即“ right
”变成了“ right\000-º\rd
”)。我用过strncpy()
并试图分配内存,但无济于事。在我的结构中,使用的cmd大小为10
,就像在初始化结构时一样,我在内部做了一个cmd[10]
,因为我知道命令永远不会超过该大小。
Node *newNode(char cmd[10], int val) {
Node *newnode = NULL;
newnode = malloc(sizeof(Node));
if(cmd == "handup" ||cmd == "handdown" ||cmd == "colour" ||cmd == "forward" ||cmd == "backward" ||cmd == "right" ||cmd == "left")
{
strcpy(newnode->cmd, cmd);
newnode->val = val;
newnode->next = NULL;
return newnode;
}
else
{
printf("Invalid command.\n");
return NULL;
}
}
我需要它来给我“正确”或“前进”等结果,但是它不断在字符串末尾添加奇怪的内容,我不知道该怎么做
答案 0 :(得分:3)
重要提示:该答案仅涵盖您代码中的一些问题。最大的问题是您尚未向我们展示完整的程序。我们不知道您的类型Node
是什么样子,我们也不知道您正在使用什么功能打印"right\000-º\rd"
。
请阅读:https://stackoverflow.com/help/minimal-reproducible-example并更新您的问题。
为什么这些字符是多余的?为什么这么重要?
字符串根据定义是“由第一个空字符终止并包括第一个空字符的连续字符序列”。如果您有一个char[10]
包含以下内容的数组对象
{ 'h', 'e', 'l', 'l', 'o', '\0', '?', '$', '\xff', '!' }
然后该数组包含长度为5的字符串,"hello"
。
strcpy
复制字符串,它只是忽略终止空字符之后不属于字符串的任何字节。 strncpy
类似,但是它不是一个字符串函数,如果您不太小心,可能会很危险;有关更多信息,请参见this article of mine。
对于大多数应用程序,您可以简单地忽略终止符'\0'
之后的所有内容。每个字符串函数都将忽略该数据,因为它不是字符串的一部分。
如果您有理由关心'\0'
字符(数组的一部分,而不是字符串的一部分)之后是什么,可以将其设置为'\0'
。最简单的方法是使用memset
将这些字节设置为零。
关于您的代码的更多观察结果:
Node *newNode(char cmd[10], int val) {
您的参数cmd
的类型为char*
,而不是char[10]
。这是一个指针参数,而不是数组参数(C没有数组参数)。
if(cmd == "handup" ...
这是一个指针比较,而不是字符串比较(由Mance Rayder的注释指出)。指针可能不相等。使用strcmp
比较字符串。 (仔细观察一下,如果cmd
作为字符串文字传递,并且如果您的编译器共享相同的字符串文字空间,那么==
可能是正确的。我们没有没看过您的整个程序,因此很难确定。)
例如,此:
if ("hello" == "hello") puts("equal"); else puts("unequal");
可以打印equal
或unequal
。
您的Node
类型可能是一个包含char*
成员cmd
的结构。您不需要为newnode->cmd
指向的字符串分配内存。
建议阅读:comp.lang.c FAQ的第6和第8节。 (以及其余部分。)