strcpy() 的属性

Properties of strcpy()

我有一个全局定义如下:

#define globalstring "example1"

typedef struct
{   
    char key[100];
    char trail[10][100];
    bson_value_t value;

} ObjectInfo;

typedef struct
{
    ObjectInfo CurrentOrderInfoSet[5];

} DataPackage;

DataPackage GlobalDataPackage[10];

我想在我的一些函数中使用 strcpy() 函数,如下所示:

strcpy(GlobalDataPackage[2].CurrentOrderInfoSet[0].key, "example2");

char string[100] = "example3";
strcpy(GlobalDataPackage[2].CurrentOrderInfoSet[0].key, string);

strcpy(GlobalDataPackage[2].CurrentOrderInfoSet[0].key, globalstring);

第一个问题:全局定义的字符串都是以100次'\0'开头的吗?

第二个问题:我对 strcpy() 的工作原理有点困惑。它只覆盖将源字符串放入目标字符串所需的字符加上末尾的 \0 并保持其余部分不变,还是完全删除目标字符串之前的任何内容?

第三个问题:我所有的字符串都是固定长度100。如果我使用上面的strcpy()的3个例子,我的字符串不超过99个字符,strcpy()是否正确地覆盖了目标字符串并用NULL终止它?意思是我 运行 以后使用 strlen()、printf() 等函数时会遇到问题?

第四问:当我strcpy()为空字符串时会发生什么?

我计划多次在循环中覆盖这些字符串,并且想知道在每次迭代中使用 memset() 以在 strcpy() 之前完全“清空”字符串是否更安全。

谢谢。

Are the global defined strings all initiated with 100 times '[=16=]'?

是的。全局字符数组将初始化为全零。

I am a bit confused as to how exactly strcpy() works. Does it only overwrite the characters necessary to place the source string into the destination string plus a [=17=] at the end and leave the rest as it

没错。它复制字符直到并包括'\0'并且不关心其余部分。

If I use ... my strings not exceeding 99 characters, does strcpy() properly overwrite the destination string and NULL terminate it?

是的,但是 NULL 是一个指针,它以零字节结尾,有时称为 NUL。你可能想看看 What is the difference between NUL and NULL? .

Meaning do I run into problems when using functions like strlen(), printf() later?

如果您的字符串长度小于或等于 99,则不会。

What happens when I strcpy() empty strings?

它只是复制了一个零字节。

would like to know if it would be safer to use memset() to fully "empty" the strings prior to strcpy() on every iteration.

安全是一个宽泛的概念。至于程序是否会正常执行的安全性,零字节之后的任何事情都没有意义,所以只需 strcpy 它。

但是您应该检查您的字符串是否少于 99 个字符并处理它们是否更长。您可能对 strnlen 感兴趣,但界面令人困惑 - 我建议使用 memcpy + 显式手动设置零字节。