C++ 如何获取C+;中字符串大小的常量值+;?

C++ 如何获取C+;中字符串大小的常量值+;?,c++,arrays,string,char,constants,C++,Arrays,String,Char,Constants,我需要能够使用ImGui文本框,但是它们不接受const char*或std::string,因此我需要将字符串转换为char数组。但是,问题是我需要我的char数组与字符串(+1)的大小相同。我得到一个错误,说它需要是声明中的常量值,但我需要能够访问字符串的大小,并生成一个将该值保持为常量的变量。这可能吗?代码如下: static std::string text = ""; static bool read_only = false; char txt[text.size

我需要能够使用
ImGui
文本框,但是它们不接受
const char*
std::string
,因此我需要将字符串转换为
char
数组。但是,问题是我需要我的
char
数组与字符串(+1)的大小相同。我得到一个错误,说它需要是声明中的常量值,但我需要能够访问字符串的大小,并生成一个将该值保持为常量的变量。这可能吗?代码如下:

static std::string text = "";
static bool read_only = false;
char txt[text.size() + 1] = text;
            

ImGui::Begin("Window");

ImGui::InputTextMultiline("Textbox", txt, IM_ARRAYSIZE(txt), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0));

ImGui::End();
         
ImGui::InputExtMultiline的格式如下:

bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL)

编辑:文本框的大小必须是任意的,并且在编译时不受静态常量值的限制,而应该是动态大小,这样字符串也一样。

使用本地
char
缓冲区来完成所需的操作。没有操作系统调用来分配内存,您应该知道您希望允许的最大输入是什么

这个函数实际上什么都不做。在获得输入后,需要将数据复制到
std::string
或其他处理方法中

std::string get_text_input(std::size_t arbitrary_size) {
    char* buf = new char[arbitrary_size];

    ImGui::Begin("Window");

    ImGui::InputTextMultiline("Textbox", buf, arbitrary_size, ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0));

    ImGui::End();

    std::string ret(buf);

    delete[] buf;

    return ret;
}

无视上述情况。您应该使用此函数签名:


bool ImGui::inputExtMultiline(const char*label,std::string*str,const ImVec2&size,imguiinputExtFlags标志,imguiinputExtCallback回调,void*user\u数据)
使用本地
char
缓冲区来完成您想要的任务。没有操作系统调用来分配内存,您应该知道您希望允许的最大输入是什么

这个函数实际上什么都不做。在获得输入后,需要将数据复制到
std::string
或其他处理方法中

std::string get_text_input(std::size_t arbitrary_size) {
    char* buf = new char[arbitrary_size];

    ImGui::Begin("Window");

    ImGui::InputTextMultiline("Textbox", buf, arbitrary_size, ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0));

    ImGui::End();

    std::string ret(buf);

    delete[] buf;

    return ret;
}

无视上述情况。您应该使用此函数签名:



bool-ImGui::inputExtMultiline(const-char*label,std::string*str,const-ImVec2&size,imguiinputExtFlags标志,imguiinputExtCallback回调,void*user\u数据)

您能将文档链接到
ImGui
上吗,这样我们就可以看到它的局限性了?还显示指示如何使用此函数的代码。如果您确实需要动态大小的
char*
,我会制作一个适当大小的
std::vector
,并使用它来获取
char*
。如果您使用的是小型函数,并且非常小心,您甚至可以使用
new
delete
std::string::data
,如果您的编译器支持C++17,并且您的组织允许,那么它也可能非常有用。C++20具有constepr字符串,因此您可以使用
.data()
来获取运行时const char*的ptr。它们还以额外的0结尾,因此与c字符字符串兼容。创建一个字符串,将字符串大小调整为适当的长度,然后将指针从
数据
中传递到
InputTextMultiline
中。完成后,您将找到空值的位置,并将字符串调整回字符串使用的长度。在这种情况下,我误解了文本框是什么。这是一个输入小部件,而不是输出小部件。请将文档链接到
ImGui
,以便我们了解其局限性?还显示指示如何使用此函数的代码。如果您确实需要动态大小的
char*
,我会制作一个适当大小的
std::vector
,并使用它来获取
char*
。如果您使用的是小型函数,并且非常小心,您甚至可以使用
new
delete
std::string::data
,如果您的编译器支持C++17,并且您的组织允许,那么它也可能非常有用。C++20具有constepr字符串,因此您可以使用
.data()
来获取运行时const char*的ptr。它们还以额外的0结尾,因此与c字符字符串兼容。创建一个字符串,将字符串大小调整为适当的长度,然后将指针从
数据
中传递到
InputTextMultiline
中。完成后,您将找到空值的位置,并将字符串调整回字符串使用的长度。在这种情况下,我误解了文本框是什么。这是一个输入小部件,不是输出小部件。我需要它是一个任意长度的文本框。这就是为什么我不能为我的
char buf[]
指定编译时值,因为
new
会导致内存泄漏吗?或者当我使用完
ImGui::End()后,可以删除吗我会的,这就是为什么我必须修复它。文本现在没有出现在屏幕上/没有被渲染。有没有办法将
inputExtMultiline
的内容存储为字符串,并进行一些操作以使其正常工作?“没有操作系统调用来分配内存”,这充其量只是一种乐观的推测。您不知道新操作员将执行什么操作。它是在其内部定义的实现。此外,在这段代码中没有什么是做不到的,并且在不幸的灾难考虑中增加了异常安全和不泄漏内存的好处。在现代C++中,没有任何实例使用<代码>运算符new < /C>和<代码>运算符删除< /代码>以外的任何新的布局场景。我需要它是任意长度的文本框。这就是为什么我不能为我的
char buf[]
指定编译时值,因为
new
会导致内存泄漏吗?或者当我使用完
ImGui::End()后,可以删除吗我会的,这就是为什么我必须修复它。文本现在没有出现在屏幕上/没有被渲染。有没有办法将
inputExtMultiline
的内容存储为字符串,并进行一些操作以使其正常工作?“没有操作系统调用来分配内存”,这充其量只是一种乐观的推测。您不知道操作员新增了什么