如果我将strncpy
函数用于字符串cat
和dog
。我不知道是否算上\0
字符,所以我想知道最终结果是否为catdo
?还是类似cat\0do
strncpy("cat", "dog", 2);
答案 0 :(得分:0)
当您在c中写出"cat"
或"dog"
之类的字符串时,无法更改数组,如果尝试,将导致未定义的行为。仅当函数期望const char * input
,const
告诉您它不能/将不会在函数中更改时,才可以使用它们。当您写入"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)
回答您的特定问题:是;空终止符将复制到目标字符串。写入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)
您完全不应使用strncpy
和strncat
函数。
它们的名称以str
开头,但它们实际上不适用于字符串。在C中,字符串定义为“以'\0'
结尾的字符序列”。这些函数不能保证所得的字符数组始终以空值结尾。
更好的选择是strlcpy
和strlcat
,但并非到处都有。
最好是一个单独的字符串库,其中确定字符串的长度是恒定时间操作。但这会分散注意力。