[英]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 的固定长度。如果我使用上面的 3 个 strcpy() 示例,我的字符串不超过 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
+ 显式手动设置零字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.