c - 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() 之前完全“清空”字符串是否更安全。
谢谢。
解决方案
全局定义的字符串是否都以 100 次 '\0' 开头?
是的。全局字符数组将被初始化为全零。
我对 strcpy() 的工作原理有点困惑。它是否只覆盖将源字符串放入目标字符串所需的字符加上末尾的 \0 并将其余部分保留为
确切地。它复制字符直到并包括 '\0' 并且不关心其余部分。
如果我使用...我的字符串不超过 99 个字符,strcpy() 是否正确覆盖目标字符串并 NULL 终止它?
是的,但NULL
它是一个指针,它以零字节终止,有时称为NUL
. 你可能想看看NUL 和 NULL 有什么区别?.
意思是我以后在使用 strlen()、printf() 等函数时会遇到问题吗?
如果您的字符串长度小于或等于 99,则不会。
当我 strcpy() 为空字符串时会发生什么?
它只复制一个零字节。
想知道在每次迭代中使用 memset() 在 strcpy() 之前完全“清空”字符串是否更安全。
安全是一个广义的概念。就安全性而言,如果程序能够正确执行,那么在乎零字节之后的任何事情都是没有意义的,所以就strcpy
这样吧。
但是您应该检查您的字符串是否小于99
字符并处理它们更长的操作。您可能对此感兴趣strnlen
,但界面令人困惑 - 我建议使用memcpy
+ 显式手动设置零字节。
推荐阅读
- python - ImportError:无法从“tensorflow_datasets”导入名称“testing”
- angular - *NgIf 中的未定义和空值
- gmail - 注释促销电子邮件 HTML 代码标记 | 没有按预期工作
- c++ - 当输入类型不正确时,C++ 第二个 cin 被吃掉了
- c++ - C++:如果我想将一系列数字输入到数组中,而不受我需要输入的数字数量的限制。我该怎么做?
- c# - C# WCF 服务从单向服务获取客户端中的状态代码
- discord.js - {update}Discord 机器人只发送消息但不发送图片
- angular - 子组件中的 ngbDropdownToggle
- laravel - 禁止:机器人被用户阻止 - laravel irazasyed/telegram-bot-sdk
- python - “错误信息”: ”[
, ]", 更新 DynamoDb 时