簡體   English   中英

字符串類C ++

[英]String Class C++

假設我想編寫自己的字符串類。 該字符串具有char * s屬性,該屬性是指向字符的指針。

現在在構造函數String::String() ,您將傳入什么以假定另一個char * 您實際上不能做類似下面的代碼的事情,因為兩個指針都指向同一件事(我們不希望這樣):

String::String(const char *str) {
        s = str;
}

任何幫助表示贊賞!

您需要深度復制字符串,即創建足夠長的字符緩沖區以合並str的內容,然后將內容復制到其中。 最簡單的方法是使用 strdup strcpy ,因為前者是非標准的:

s = new char[strlen (str) + 1];
if (s == NULL) throw some_exception;
strcpy (s, str);

請不要編寫自己的字符串類。 您必須知道很多細節,不要引入錯誤(例如,重載運算符,布爾習語等),還有許多細節可以使該字符串類高效(例如,實現寫時復制)等等。但是僅出於教育目的,您必須復制所傳遞的字符串。 這是一個例子:

#include <cstdint>
#include <cstring>
#include <cstdio>

class String
{
    char *p_;

public:
    explicit String (const char *str)
    {
        auto length = std::strlen (str) + 1;
        p_ = new char [length];
        std::memcpy (p_, str, length);
    }

    ~String ()
    {
        delete [] p_;
        p_ = nullptr;
    }

    inline const char *c_str () const
    {
        return p_;
    }
};

int
main ()
{
    String s ("Hello, world!");
    std::printf ("%s\n", s.c_str ());
}

您應該復制作為參數傳遞的以空終止的字符串的內容。

一件事是您可能會刪除終止null,因為如果您擁有自己的類,則可以通過保持當前長度來手動管理字符串邊界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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