[英]problem with strcpy() when trying to copy a string to a string
最近又開始做一些 c 編程,目前有分配問題。 以下 function 應該通過為其分配 memory 來初始化字符串,這也是我需要使用 Assert() 的第一個分配。 我必須編寫dstring_initialize
的函數,以便以下工作:
DString str1, str2;
str1 = dstring_initialize("");
dstring_delete(&str1);
assert(str1 == NULL);
我搞砸了可能是一些基本的東西,這就是 function 目前的樣子:
DString dstring_initialize(const char* str)
{
assert(str != NULL);
char* str1;
str1 = (char*)malloc(sizeof(char));
strcpy(str1, str);
assert(str1 == str);
return str1;
}
我收到的錯誤消息是最后一個 Assert, Assert(str1 == str)
失敗,我一直在嘗試不同的事情,但無法弄清楚我做錯了什么。
你有幾個基本的誤解。 首先,C中沒有字符串class。 如果您在數組末尾使用 append 和 null 終止符\0
,則只有字符 arrays 可以用作字符串。
DString
在 typedef 后面隱藏指針char*
是非常糟糕的做法。 你最終只會自欺欺人,當你沒有時,你有某種形式的字符串 class。 擺脫這個邪惡的typedef
。str1 = (char*)malloc(sizeof(char));
這僅分配一個字符,不是很有幫助。strcpy(str1, str);
這將復制直到strcpy
在str
中找到 null 終止符。 自從您通過""
后,它會立即執行此操作。 所以它實際上不會復制除 null 終結器之外的任何東西。 它與str1[0]='\0';
本質上是一樣的。 .assert(str1 == str);
比較地址而不是內容。 str1
和str
是不同的對象,它們永遠不會有相同的地址,所以這個斷言總是會失敗。 要比較字符串內容,請使用strcmp()
。從這里開始,我建議重新訪問您的 C 書並按順序學習 arrays、指針和字符串。
assert(str1 == str);
在這一行上,您比較兩個指針。 在您的斷言之前添加這一行:
printf("%p\n", str1); printf("%p\n", str); printf("%d\n", str1 == str);
如果要比較兩個字符串,可以使用 strcmp 為例。
但這不是很安全,您可以查看 strcmp 和 strcpy 的人以了解原因。
首先我必須提到,在使用 C-Strings 時,您通常會添加一個長度信息。 如果沒有,你必須確保你的字符串都是空終止的。
其次,這一行str1 = (char*)malloc(sizeof(char));
沒有意義,因為您只分配了一個字符。
第三,你正在比較你得到的指針和我剛才提到的無效指針,而不是字符串本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.