示例strncpy()

时间:2019-04-10 23:14:59

标签: c string

如果我将strncpy函数用于字符串catdog。我不知道是否算上\0字符,所以我想知道最终结果是否为catdo?还是类似cat\0do

strncpy("cat", "dog", 2);

3 个答案:

答案 0 :(得分:0)

当您在c中写出"cat""dog"之类的字符串时,无法更改数组,如果尝试,将导致未定义的行为。仅当函数期望const char * inputconst告诉您它不能/将不会在函数中更改时,才可以使用它们。当您写入"dog"时,字符数组中的数据将如下所示:

{'d','o','g','\0'}

注意,它已终止NUL。

您正在使用的功能:

char *strncpy(char *dest, const char *src, size_t n)

src复制到dst,最大长度为n,如上所述,您不能复制到"cat",您可以看到char *dest不是常数,而是const char * src是常数。因此来源可能是"cat""dog"

如果要为字符串分配空间,则可以对其进行修改:

char cat_str[] = "cat";

现在字符数组cat_str已初始化为"cat",但我们可以始终对其进行更改,请注意其长度将为4(每个字母加一个NUL),因为我们未指定长度。因此,请确保不要更改cat_str [3]之后的内容,可以将其索引为0到3

答案 1 :(得分:0)

正如torstenvl所述,"cat""dog"是字符串文字,因此此处使用的函数不正确。第一个参数是目标,第二个参数是源,第三个参数是要复制的字节数。

char *strncpy(char *restrict s1, const char *restrict s2, size_t n)
  

来源:The Open Group Base Specification - strncpy

回答您的特定问题:是;空终止符将复制到目标字符串。写入n个字节,如果源字符串s2短于n个字节,则填充NULL直到写入n个字节。

在您的问题中,您似乎正在尝试附加两个字符串。要在C语言中执行此操作,您需要首先分配一个源字符串缓冲区,将第一个字符串复制过来,然后从第二个字符串的末尾开始复制第二个字符串。根据最后一步的开始位置,您可以以“ catdog \ 0”或“ cat \ 0dog \ 0”结尾。这是典型的“一人一失”错误的另一个示例。

要开始,必须计算要附加的两个字符串的长度。您可以使用strlen中的string.h进行此操作。 strlen不会将空终止符计为长度的一部分,因此请记住,要获取最终字符串的长度,您必须执行strlen(s1) + strlen(s2) + 1。 / p>

然后可以像往常一样复制第一个字符串。完成第二个副本的一种简单方法是执行以下操作:

char* s2start = finalString[strlen(s1) + 1];

然后您可以执行strncpy(s2start, s2, [the size of s2]),这样您就知道自己正在s1空终止符上开始,避免了“ cat \ 0dog”错误。

希望这会有所帮助,祝你好运。

答案 2 :(得分:0)

您完全不应使用strncpystrncat函数。

它们的名称以str开头,但它们实际上不适用于字符串。在C中,字符串定义为“以'\0'结尾的字符序列”。这些函数不能保证所得的字符数组始终以空值结尾。

更好的选择是strlcpystrlcat,但并非到处都有。

最好是一个单独的字符串库,其中确定字符串的长度是恒定时间操作。但这会分散注意力。