gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:41:59 27 4
gpt4 key购买 nike

基本上,我的程序使用链表向机器人发出命令。我正在使用 strcpy() 将命令复制到我的链表节点结构中,但它在末尾添加了不需要的字符(即“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;
}

}

我需要它给我一个“正确”或“前进”等结果,但它不断在字符串末尾添加奇怪的东西,我不知道该怎么办

最佳答案

重要说明此答案仅涵盖代码中的一些问题。最大的问题是你没有向我们展示完整的程序。我们不知道您的类型 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");

可以打印等于不等于

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

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

关于c - Strncpy 在字符串末尾给出不需要的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56727877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com