【问题标题】:How can I get a const value for the size of a string in C++?如何在 C++ 中获取字符串大小的 const 值?
【发布时间】:2024-01-16 22:34:01
【问题描述】:

我需要能够使用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::InputTextMultiline 的格式是这样的:

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)

编辑:文本框需要是任意大小,并且在编译时不受静态 const 值的限制,而是动态大小,以便字符串也是如此。

【问题讨论】:

  • 您能否将文档链接到ImGui,以便我们了解它的局限性?同时显示代码,表明你想如何使用这个函数。
  • 如果你绝对需要一个动态大小的char *,我会制作一个适当大小的std::vector<char> 并使用std::vector::data 来获得char *。如果你在一个小函数中并且小心,你甚至可以使用newdelete
  • 如果您的编译器支持 C++17 并且您的组织允许,std::string::data 也可能很有用。
  • c++20 具有 constexpr 字符串,因此您可以使用 .data() 获取运行时 const char* 的指针。它们也以额外的 0 结尾,因此与 c char 字符串兼容。
  • 说实话,在这种情况下几乎没有意义。您创建一个字符串,将字符串大小调整为适当的长度,然后将指针从data 和长度传递到InputTextMultiline。完成后,您会找到 null 的位置并将字符串的大小调整回字符串使用的长度。我误解了在这种情况下文本框是什么。它是一个输入小部件,而不是一个输出小部件。

标签: c++ arrays string char constants


【解决方案1】:

使用本地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;
}

忽略以上。您应该使用此函数签名: https://github.com/ocornut/imgui/blob/01cc6660395032714e7a991eba679a9c69b00c5b/misc/cpp/imgui_stdlib.cpp#L54

bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)

【讨论】:

  • 我需要它是一个任意长度的文本框。这就是为什么我不能为我的char buf[] 指定编译时间值
  • new 会有内存泄漏吗?或者当我处理完ImGui::End(); 后可以删除吗?
  • 我会的,这就是为什么我要修复它。
  • 文本现在没有出现在屏幕上/没有被渲染。有什么办法可以将InputTextMultiline 的内容存储为字符串并进行一些操作以使其正常工作。?
  • “没有分配内存的操作系统调用,”这充其量只是乐观的推测。你不知道operator new 会做什么。它在其内部是实现定义的。此外,这段代码中没有什么是std::vector<char> 可以 做的,并且在不幸的灾难考虑中增加了异常安全和不泄漏内存的好处。在现代 C++ 中确实 没有 实例可以将 operator newoperator delete 用于放置新场景之外的任何东西
最近更新 更多