0

在这个示例程序中,为了说明这种行为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]);
}
4

5 回答 5

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 之后的额外内存位置在引用它时不会影响您使用以前的位置。

于 2013-05-11T03:50:36.300 回答
1

strcpy还将复制空终止符,因此如果您执行以下操作:

printf( "%s\n", previous) ;

在您的情况下,您只会看到S在大多数情况下哪个就足够了。如果您真的想在执行 a 之前将内存清零,strcpy您可以随时memset在复制之前使用:

memset(previous, 0, sizeof(previous)) ;
于 2013-05-11T03:43:35.603 回答
0

1) 这是 strcpy() 的正确行为。如果您使用 str* 值来访问字符串,您将永远看不到任何未更改的字节,因为字符串终止符 ('\0') 被放置在第二个位置(索引 0)并且 str* 函数不会通过字符串的结尾。

2) 这不是 memcpy() 的行为。如果是memcpy(str2, str1, 10),将复制 10 个字符。memcpy(previous, "S", 10)然而,这不是一个好主意;-)

3)如果你想在strcpy()之前将previous []归零,试试类似的东西memset(previous, '\0', sizeof(previous))

于 2013-05-11T03:38:34.723 回答
0

你在实现自己的strcpy()功能吗?如果是这样,请不要忘记将源字符串中的空终止符复制到目标。空终止符告诉 C 字符串在哪里结束。字符串库中的默认实现就是这样做的,当你使用它打印出来时,printf()它会显示你所期望的。

如果内存分配是一个问题,那么您可以使用字符串free()占用的空间previous,然后再malloc()为您复制的字符串提供足够的空间,但这在大多数情况下都是多余的,除非您真的担心内存限制,在这种情况下您可能不会使用字符串库。

于 2013-05-11T03:40:12.720 回答
0

字符串中的其余字符实际上应该没有任何影响,因为前一个字符串将S作为第一个字符(即,previous[0]),而 NULL 值作为第二个字符。除非您的代码检查字符串中的特定字符,否则这无关紧要。但是,如果您真的希望字符串具有您复制的值,然后是所有 NULL,您可以在执行 strcpy 之前清除字符串。

memset(previous, 0, sizeof(previous));
strcpy(previous, "S");
于 2013-05-11T03:41:04.850 回答