簡體   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