如何在s
中访问s[7]
?
我没有观察到strncpy
和memcpy
之间有任何区别。如果我想打印输出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
6条答案
按热度按时间unftdfkk1#
其他人已经指出了你的空终止问题。在理解
memcpy
和strncpy
之间的区别之前,您需要了解空终止。主要区别是
memcpy
将复制您要求的所有N个字符,而strncpy
将复制到第一个空终止符(包括在内)或N个字符,以较少者为准。如果它复制的字符少于N个,它将用空字符填充其余的字符。
0qx6xfy62#
您将得到输出
querty
,因为索引7
不正确(数组的索引从0开始,而不是1)。在索引6
处有一个null-terminator来表示字符串的结束,无论它后面的是什么都没有影响。有两件事你需要解决:
1.将
s[7]
中的7
更改为6
1.在
s[7]
处添加空终止符结果将是:
Original not working和fixed working。
至于
strncpy
与memcpy
的问题,不同之处在于strncpy
为您添加了一个空终止符。但是,只有当源字符串在n
之前有一个。所以strncpy
是你想在这里使用的,但是要非常小心大的BUT。kgqe7b3p3#
Strncpy将复制到
NULL
,即使你指定了要复制的字节数,但memcpy将复制到指定的字节数。printf语句将打印到NULL,因此您将尝试打印单个字符,它将显示,
输出
n6lpvg4x4#
要创建“qwertyA”,需要设置
s[6] = 'A'
和s[7]='\0'
字符串从0开始索引,所以
s[0] == 'q'
,并且它们需要以null结尾。aiazj4mn5#
当您有:
这就是数组包含的内容:
如果你想在字符串的末尾加上一个'A',那就是在索引6处,因为数组索引从0开始
注意,当你以这种方式初始化一个数组时,剩余的空间被设置为0(一个nul终止符),虽然在这种情况下不需要,但通常要注意你需要让你的字符串以nul终止。例如
在上面的示例中,“qwerty”(包括其nul终止符)被复制到
s
。s[6]覆盖nul终止符。由于s
的其余部分没有初始化,因此我们需要使用s[7] = 0;
添加一个nul终止符cgvd09ve6#
正如Philip Potter所解释的那样,主要区别在于memcpy将复制您要求的所有n个字符,而strncpy将复制到第一个null终止符(包括第一个null终止符)或n个字符(以较小者为准)。如果strncpy复制的字符少于N个,它将用空字符填充其余的字符。下面的程序将回答您的问题:
o/p:
执行下面的代码并检查差异,您可能会发现它很有用。
输出: