在此示例程序中,为了说明strcpy()
的这种行为,我在一个更大的字符串"S"
中写了一个字符串previous
,原始字符为"Delaware"
。但这只覆盖了影响原始字符串中的前两个字符。原始字符串的其余部分继续具有相同的值。如何处理? (即使memcpy()
似乎也有相同的行为)。我的意思是,如何将剩余的字符转换为0
?或者字符串中的其余字符保留其原始值没有副作用?
#include<stdio.h>
#include<string.h>
int main()
{
char previous[10]="Delaware";
printf("The character at position 4 is %c\n",previous[4]);
strcpy(previous,"S");
printf("The character at position 4 later is %c",previous[4]);
}
答案 0 :(得分:4)
strcpy函数执行此操作:
previous "S"
| |
v v
-- -- -- -- -- -- -- -- -- -- -- -
| D| e| l| a| w| a| r| e|\0| | | S|\0|
-- -- -- -- -- -- -- -- -- -- -- --
^ ^ | |
| | | |
| - - - - - - - - - - - - - - - -
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
让你的记忆看起来像这样:
-- -- -- -- -- -- -- -- -- -- -- -
| S|\0| l| a| w| a| r| e|\0| | | S|\0|
-- -- -- -- -- -- -- -- -- -- -- --
在引用诸如printf之类的东西时,0之后的额外字符无关紧要。就像特拉华州0之后的额外内存位置一样,在引用它时不会影响你之前的使用。
答案 1 :(得分:1)
strcpy
也将复制null终止符,如果你执行:
printf( "%s\n", previous) ;
在您的情况下,您只会看到S
,这在大多数情况下都足够了。如果您真的想在执行strcpy
之前将内存清零,则可以在复制之前始终使用memset
:
memset(previous, 0, sizeof(previous)) ;
答案 2 :(得分:0)
1)这是strcpy()的正确行为。如果你使用str *值来访问字符串,你将永远不会看到任何未更改的字节,因为字符串终止符('\ 0')被放置在第二个位置(索引0)并且str *函数将不会通过字符串的结尾。
2)这不是memcpy()的行为。如果您memcpy(str2, str1, 10)
,将复制10个字符。 memcpy(previous, "S", 10)
不是一个好主意;-)
3)如果你想在strcpy()之前将前一个[]归零,请尝试类似memset(previous, '\0', sizeof(previous))
答案 3 :(得分:0)
您是否正在实施自己的strcpy()
功能?如果是这样,请不要忘记将null终止符从源字符串复制到目标。 null终止符告诉C字符串结束的位置。字符串库中的默认实现执行此操作,当您使用printf()
将其打印出来时,它将显示您所期望的内容。
如果内存分配是一个问题,那么你可以free()
previous
字符串占用的空间,然后malloc()
足够你所复制的字符串,但在大多数情况下这是过度的除非你真的担心内存限制,在这种情况下你可能不会使用字符串库。
答案 4 :(得分:0)
字符串中的其余字符确实应该没有效果,因为上一个字符串将 S 作为第一个字符(即前一个[0])和NULL值作为第二个。除非您的代码检查字符串中的特定字符,否则无关紧要。但是,如果您确实希望字符串具有您复制的值,然后是所有NULL,则可以在执行strcpy之前清除该字符串。
memset(previous, 0, sizeof(previous));
strcpy(previous, "S");