Strncpy在字符串末尾给出不需要的字符

时间:2019-06-23 21:31:53

标签: c string struct linked-list

基本上,我的程序使用链接列表向机器人发出命令。我正在使用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;
   }

}

我需要它来给我“正确”或“前进”等结果,但是它不断在字符串末尾添加奇怪的内容,我不知道该怎么做

1 个答案:

答案 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");

可以打印equalunequal

您的Node类型可能是一个包含char*成员cmd的结构。您不需要为newnode->cmd指向的字符串分配内存。

建议阅读:comp.lang.c FAQ的第6和第8节。 (以及其余部分。)