strncpy和memcpy之间的区别?

我如何在s访问s[7]

我没有发现strncpymemcpy之间有任何区别。 如果我想打印输出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 */ 

其他人指出了你的空终止问题。 在理解memcpystrncpy之间的区别之前,您需要了解空终止。

不同之处在于memcpy将复制您要求的所有N个字符,而strncpy将复制到第一个空终止符(包括N个字符),以较少者为准。 (如果它复制少于N个字符,它将使用空字符填充其余部分。)

您正在获取输出querty因为索引7不正确(数组从0开始索引,而不是1)。 在索引6处有一个空终止符来表示字符串的结尾,并且在它之后发生的任何事情都没有效果。

你需要解决两件事:

  1. s[7]s[7]更改为6
  2. s[7]添加一个空终止符

结果将是:

 char s[10] = "qwerty"; s[6] = 'A'; s[7] = 0; 

原来不工作和固定工作 。

至于strncpymemcpy的问题,区别在于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