簡體   English   中英

嘗試將字符串復制到字符串時出現 strcpy() 問題

[英]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); 這將復制直到strcpystr中找到 null 終止符。 自從您通過""后,它會立即執行此操作。 所以它實際上不會復制除 null 終結器之外的任何東西。 它與str1[0]='\0';本質上是一樣的。 .
  • assert(str1 == str); 比較地址而不是內容。 str1str是不同的對象,它們永遠不會有相同的地址,所以這個斷言總是會失敗。 要比較字符串內容,請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM