[英]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 // -> ...
我知道這可能不是問這種性質的問題的平台,但是一點幫助將大有幫助。 感謝您的通讀。
globalString
是char*
,它指向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.