strncpy和memcpy之间的区别?

时间:2011-01-04 13:06:16

标签: c memcpy strncpy

如何在s[7]中访问s

我没有发现strncpymemcpy之间存在任何差异。如果我想打印输出s以及s[7](如qwertyA),我必须在以下代码中进行哪些更改:

#include <stdio.h>
#include <stdlib.h>
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
*/

5 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:8)

您收到输出querty,因为索引7不正确(数组从0开始索引,而不是1)。在索引6处有一个null-terminator来表示字符串的结尾,而在它之后的任何内容都没有效果。

您需要解决两件事:

  1. 7中的s[7]更改为6
  2. s[7]
  3. 添加空终结符

    结果将是:

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

    Original not workingfixed working

    关于strncpymemcpy的问题,区别在于strncpy为您添加了一个空终结符。但是,仅当源字符串在n之前有一个。所以strncpy就是你想要在这里使用的,但是要非常小心大胆。

答案 2 :(得分:3)

即使您指定了要复制的字节数,Strncpy也会复制到NULL,但memcpy将复制到指定的字节数。

printf语句将打印为NULL,因此您将尝试打印单个字符,它将显示,

printf("\t%c %c %c\t",s[7],str[7],str1[7]);

输出

  7              7

答案 3 :(得分:2)

要制作“qwertyA”,您需要设置s[6] = 'A's[7]='\0'

字符串从0开始索引,因此s[0] == 'q',它们需要以空值终止。

答案 4 :(得分:2)

当你有:

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终止。 e.g。

char s[10];
strcpy(s,"qwerty");
s[6] = 'A';
s[7] = 0;

在上面的示例“qwerty”中,包括其nul终止符被复制到s。 s [6]覆盖了那个n终结符。由于s的其余部分未初始化,我们需要使用s[7] = 0;

自行添加一个nul终结符