[英]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.