strncpy和memcpy的区别

xeufq47z  于 2023-06-05  发布在  其他
关注(0)|答案(6)|浏览(376)

如何在s中访问s[7]
我没有观察到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;
}

输出:

qwerty
qwerty
qwerty
unftdfkk

unftdfkk1#

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

主要区别是memcpy将复制您要求的所有N个字符,而strncpy将复制到第一个空终止符(包括在内)或N个字符,以较少者为准

如果它复制的字符少于N个,它将用空字符填充其余的字符。

0qx6xfy6

0qx6xfy62#

您将得到输出querty,因为索引7不正确(数组的索引从0开始,而不是1)。在索引6处有一个null-terminator来表示字符串的结束,无论它后面的是什么都没有影响。
有两件事你需要解决:
1.将s[7]中的7更改为6
1.在s[7]处添加空终止符
结果将是:

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

Original not workingfixed working
至于strncpymemcpy的问题,不同之处在于strncpy为您添加了一个空终止符。但是,只有当源字符串在n之前有一个。所以strncpy是你想在这里使用的,但是要非常小心大的BUT。

kgqe7b3p

kgqe7b3p3#

Strncpy将复制到NULL,即使你指定了要复制的字节数,但memcpy将复制到指定的字节数。
printf语句将打印到NULL,因此您将尝试打印单个字符,它将显示,

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

输出

7              7
n6lpvg4x

n6lpvg4x4#

要创建“qwertyA”,需要设置s[6] = 'A's[7]='\0'
字符串从0开始索引,所以s[0] == 'q',并且它们需要以null结尾。

aiazj4mn

aiazj4mn5#

当您有:

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]覆盖nul终止符。由于s的其余部分没有初始化,因此我们需要使用s[7] = 0;添加一个nul终止符

cgvd09ve

cgvd09ve6#

正如Philip Potter所解释的那样,主要区别在于memcpy将复制您要求的所有n个字符,而strncpy将复制到第一个null终止符(包括第一个null终止符)或n个字符(以较小者为准)。如果strncpy复制的字符少于N个,它将用空字符填充其余的字符。下面的程序将回答您的问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char s[10] = "qwerty",str1[10];
    int i;
    s[7] = 'A';
    memcpy(str1, s, 8);
    for(i=0;i<8;i++)
    {
        if(str1[i]!='\0')
            printf("%c",str1[i]);
    }
    return 0;
}

o/p:

qwertyA

执行下面的代码并检查差异,您可能会发现它很有用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char s[10] = "qwer\0ty", 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);
    for(int i = 0; i<8; i++)
    {
        printf("%d=%c,",i,str[i]);
    }
    printf("\n");
    for(int i = 0; i<8; i++)
    {
        printf("%d=%c,",i,str1[i]);
    }
    return 0;
}

输出:

qwer
qwer
qwer
0=q,1=w,2=e,3=r,4=,5=,6=,7=,
0=q,1=w,2=e,3=r,4=,5=t,6=y,7=A,

相关问题