簡體   English   中英

C樣式的字符串未使用=運算符更新-C ++

[英]C-style String not updated with = operator - C++

所以最近我正在玩創建自己的代表通用數據(例如字符串,數字和數組)的C ++類的概念。

到目前為止,我在這方面的進展一直很好(如此處所示: https : //github.com/LapysDev/LapysCPP )。

除了一個結。 為了我的一生,我無法弄清楚為什么下面的代碼在創建帶有可變數量參數的String類對象時會出錯。

#include <iostream>
#include <sstream>
#include <string.h>

// Make a new C-style string (or stringify a value).
char* stringify(char character) {
    std::string stream = static_cast<std::ostringstream*>(&(std::ostringstream() << character)) -> str();
    char* string = new char[stream.size() + 1];

    strcpy(string, stream.c_str());
    return string;
}
template <typename data> char* stringify(data string) { return strdup(std::string(string).c_str()); }

char* globalString = stringify("");

class String {
    public:
        char* value = stringify("");

        String() {}
        template <typename data>
        String(data value) {
            strcat(globalString, value);
            this -> value = stringify(globalString);
            globalString = stringify("");
        }
        template <typename data, typename... argumentsData>
        String(data value, argumentsData... values) {
            strcat(globalString, stringify(value));
            String(values...);
        }
};

int main(int argc, char* argv[]) {
    std::cout << "String [1]: '" << String("Hello, World!").value << '\'' << std::endl;
    // -> String [1]: 'Hello, World!'

    std::cout << "String [3]: '" << String("Hello,", ' ', "World!").value << '\'';
    // -> String [3]: ''

    return 0;
}

我已經嘗試了使用代碼的所有方法(是的,禁止使用std::string作為文本值)。 如果有任何人可以解釋為什么在使用char*時使用多個參數會出錯,那么歡迎您發表評論。

總而言之,我需要能夠使用可變數量的參數來創建具有適當value屬性的String對象。

// Works fine
String("Hello, World!").value // -> Hello, World!

// Needs fixing
String("Hello,", ' ', "World!").value // -> ...

我知道這可能不是問這種性質的問題的平台,但是一點幫助將大有幫助。 感謝您的通讀。

globalStringchar* ,它指向stringify("");的返回值stringify("");

stringify("")返回strdup(std::string(string).c_str()); strdup返回一個動態分配的字符串,該字符串具有其參數的長度(和相同的內容)。

在這里, ""僅包含\\0因此從strdup返回的C字符串的長度僅為1


然后,您嘗試使用globalString作為目標調用strcat(destination, source) ,但是globalString不足以容納source

strcat說:

如果目標數組的大小不足以容納src和dest的內容以及終止的空字符,則該行為不確定。 如果字符串重疊,則行為未定義。 如果dest或src不是指向以空字符結尾的字節字符串的指針,則該行為是不確定的。

因此,您的兩個測試用例都是UB。 即使是第一個測試也似乎運行良好。


std::string為您處理所有這一切。 如果由於某種原因(教授)給您某種(愚蠢的)理由而不允許您使用它,那么請確保在調用strcat之前為globalString分配足夠的空間,C字符串是棘手的野獸。

暫無
暫無

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

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