strcpy()将一个小字符串变成一个更大的字符串,使更大字符串的其余部分保持不变。如何处理它?

时间:2013-05-11 03:28:33

标签: c string memcpy strcpy null-character

在此示例程序中,为了说明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]);
}

5 个答案:

答案 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");