strncpy和memcpy之间的区别?
我如何在s
访问s[7]
?
我没有发现strncpy
和memcpy
之间有任何区别。 如果我想打印输出s
,连同s[7]
(如qwertyA
),我必须在以下代码中做出哪些更改:
#include #include int main() { char s[10] = "qwerty", str[10], str1[10]; s[7] = 'A'; printf("%s\n",s); strncpy(str,s,8); printf("%s\n",str); memcpy(str1,s,8); printf("%s\n",str1); return 0; } /* O/P qwerty qwerty qwerty */
其他人指出了你的空终止问题。 在理解memcpy
和strncpy
之间的区别之前,您需要了解空终止。
不同之处在于memcpy
将复制您要求的所有N个字符,而strncpy
将复制到第一个空终止符(包括N个字符),以较少者为准。 (如果它复制少于N个字符,它将使用空字符填充其余部分。)
您正在获取输出querty
因为索引7
不正确(数组从0开始索引,而不是1)。 在索引6
处有一个空终止符来表示字符串的结尾,并且在它之后发生的任何事情都没有效果。
你需要解决两件事:
- 将
s[7]
中s[7]
更改为6
- 在
s[7]
添加一个空终止符
结果将是:
char s[10] = "qwerty"; s[6] = 'A'; s[7] = 0;
原来不工作和固定工作 。
至于strncpy
与memcpy
的问题,区别在于strncpy
为你添加了一个null-terminator。 但是,仅当源字符串在n
之前有一个。 所以strncpy
就是你想在这里使用的东西,但是要非常小心。
要制作“qwertyA”,你需要设置s[6] = 'A'
和s[7]='\0'
字符串从0开始索引,因此s[0] == 'q'
,它们需要以空值终止。
当你有:
char s[10] = "qwerty";
这是该数组包含的内容:
s [0]'q' s [1]'w' s [2]'e' s [3]'r' s [4]'t' s [5]'y' s [6] 0 s [7] 0 s [8] 0 s [9] 0
如果要在字符串的末尾添加“A”,那么它位于索引6处,因为数组索引从0开始
s[6] = 'A';
请注意,当您以这种方式初始化数组时,剩余空间设置为0(nul终结符),虽然在这种情况下不需要,但通常要注意您需要使字符串nul终止。 例如
char s[10]; strcpy(s,"qwerty"); s[6] = 'A'; s[7] = 0;
在上面的例子中“qwerty”,包括它的nul终结符被复制到s
。 s [6]覆盖了那个n终结符。 由于s
的其余部分未初始化,我们需要自己添加一个nul终结符,其中s[7] = 0;
即使您指定要复制的字节数,Strncpy也会复制到NULL
,但memcpy将复制到指定的字节数。
printf语句将打印为NULL,因此您将尝试打印单个字符,它将显示,
printf("\t%c %c %c\t",s[7],str[7],str1[7]);
OUTPUT
7 7