繁体   English   中英

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 的固定长度。如果我使用上面的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM