首页 > 试题广场 >

有变量char buf[] = ”SH_60...

[不定项选择题]
有变量
char buf[] = ”SH_600570_”;
想把其内容修改为 ”SH__600570”,下列哪些语句是正确的 (        )
  • strcpy(buf + 3, buf + 2);
  • strncpy(buf + 3, buf + 2, 7);
  • memcpy(buf + 3, buf + 2, 7);
为什么B不行呢
发表于 2019-09-22 11:51:05 回复(2)
C也可以,这题有问题
发表于 2021-04-29 22:59:08 回复(0)
https://www.cnblogs.com/philipce/p/6774785.html  这个解释比较通俗易懂,主要是在拷贝的内存区域有重叠的时候,这几个函数的处理方式不一样。memmove,在重叠上可以采用反向复制
编辑于 2020-09-10 14:54:36 回复(0)
memmove() 用来复制内存内容,其原型为: void * memmove(void *dest, const void *src, size_t num); memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。 memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。
发表于 2019-09-18 17:01:28 回复(0)
这道题我怎么连D的选项都找不到
发表于 2023-10-20 19:00:05 回复(0)
就本题来说 c也可以啊
发表于 2021-01-16 17:22:39 回复(0)
D在哪?
编辑于 2024-02-29 19:07:48 回复(0)
函数memcpy从s2指向的对象中复制n个字符到s1指向的对象中。如果复制发生在两个重叠的对象中,则这种行为未定义。
函数strcpy把s1指向的串(包括空字符)复制到s2指向的数组中。如果复制发生在两个重叠的对象中,则这种行为未定义。
函数strncpy从s1指向的数组中最多复制n个字符(不复制空字符后面的字符)到s2指向的数组中。如果复制发生在两个重叠的对象中,则这种行为未定义。

strcpy 是依据 “\0” 作为结束判断的,如果 s2 的空间不够,则会引起 buffer overflow。

memcpy用来在内存中复制数据,由于字符串是以“\0”结尾的,所以对于在数据中包含“\0”的数据只能用memcpy,如:"hell\0oworld"。

Strncpy和memcpy很相似,只不过它在一个终止的空字符处停止。当n>strlen(s1)时,给s2不够数的空间里填充“\0”;当n<=strlen(s1)时,s2是没有结束符“\0”的。

这里隐藏了一个事实,就是s2指向的内存一定会被写n个字符。



发表于 2023-03-23 01:59:56 回复(0)
C答案 memcpy按道理应该会出现内存重叠的情况,得不到正确的结果啊这里不应该使用memmove吗
发表于 2022-05-31 00:14:37 回复(0)
【正确答案】D
【解析】strcpy是拷贝字符串,在拷贝结束的时候会为字符串添加一个'\0';
strncpy是拷贝字符,不会再字符串末尾添加'\0',只按给出的字符个数来拷贝,拷贝完n个字符就结束。但是,如果n比src的长度大,那么空余的部分会被'\0'填充,以保证拷贝n个字符。
strcpy和strncpy都只能接受char*,也就是字符类型的数据,如果是结构体,没办法操作。而且,这两个函数如果遇到dest和src的内存重叠会导致程序崩溃。
memcpy是内存拷贝,可以接受数组,整型,结构体,类等任何类型,它实现的是内存的拷贝。
memmove 可以避免内存区域重叠问题。如果出现重叠,则采用反向复制,从后向前复制字符串,如果不重叠,则正向复制,从前向后复制。
 

编辑于 2022-04-10 20:21:45 回复(0)
B、C、D都可以吧
发表于 2020-08-23 17:24:15 回复(0)
<p>实测c也可以</p>
发表于 2020-08-15 23:03:40 回复(0)