如何在s[7]
中访问s
?
我没有发现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;
}
/*
O/P
qwerty
qwerty
qwerty
*/
答案 0 :(得分:27)
其他人指出了你的空终止问题。在了解memcpy
和strncpy
之间的区别之前,您需要了解空终止。
区别在于memcpy
将复制您要求的所有N个字符,而strncpy
将复制到第一个空终止符(包括第一个)或N个字符(以较少者为准)。 (如果它复制少于N个字符,它将用空字符填充其余部分。)
答案 1 :(得分:8)
您收到输出querty
,因为索引7
不正确(数组从0开始索引,而不是1)。在索引6
处有一个null-terminator来表示字符串的结尾,而在它之后的任何内容都没有效果。
您需要解决两件事:
7
中的s[7]
更改为6
s[7]
结果将是:
char s[10] = "qwerty";
s[6] = 'A';
s[7] = 0;
Original not working和fixed working。
关于strncpy
与memcpy
的问题,区别在于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;