首页 > 解决方案 > 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() 之前完全“清空”字符串是否更安全。

谢谢。

标签: cstringglobal-variablesstrcpy

解决方案


全局定义的字符串是否都以 100 次 '\0' 开头?

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

我对 strcpy() 的工作原理有点困惑。它是否只覆盖将源字符串放入目标字符串所需的字符加上末尾的 \0 并将其余部分保留为

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

如果我使用...我的字符串不超过 99 个字符,strcpy() 是否正确覆盖目标字符串并 NULL 终止它?

是的,但NULL它是一个指针,它以零字节终止,有时称为NUL. 你可能想看看NUL 和 NULL 有什么区别?.

意思是我以后在使用 strlen()、printf() 等函数时会遇到问题吗?

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

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

它只复制一个零字节。

想知道在每次迭代中使用 memset() 在 strcpy() 之前完全“清空”字符串是否更安全。

安全是一个广义的概念。就安全性而言,如果程序能够正确执行,那么在乎零字节之后的任何事情都是没有意义的,所以就strcpy这样吧。

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


推荐阅读