【问题标题】:Output const char * with delimiters输出带有分隔符的 const char *
【发布时间】:2017-12-07 07:04:24
【问题描述】:

我有一个问题,我想获取一个从具有多行的函数创建的字符串,我需要在其中获取所有新行分隔符,以便以后在 Python 中进行格式化。

例如:

const char * getInfoLogFunction()
{
    static char buffer[4096];
    glGetShaderInfoLog(shader, 4096, NULL, buffer);

    const char * compileStatus = buffer;
    return compileStatus
}

现在 compileStatus 指向一个字符串,例如:

这是一个字符串。

多行。

稍后我需要将 compileStatus 发送到应用程序,该应用程序会将整个字符串放入制表符分隔表的 1 个单元格中。然后,使用 Python,我需要将单行字符串格式化回多行。如果分隔符在字符串中但它们不在,我可以轻松做到这一点。

有没有一种方法可以从 compileStatus 获取字符串并对其进行格式化,以便包含所有分隔符?

我发现了很多隐式创建字符串的示例,例如:

myString = R"xyz(Some String)xyz"

但我找不到格式化由函数生成的 const char * 引用的字符串的方法。

谢谢

【问题讨论】:

  • 这感觉就像XY problem。该函数已经返回一个带有换行符的字符串。听起来应用程序在表格中显示字符串时会删除换行符。原始功能对此无能为力。应用程序不应删除换行符,或应记住原始字符串以便在需要时对其进行解析。
  • 这也是很糟糕的设计。对该函数的每次调用都会追溯覆盖之前返回的所有字符串,作为副作用。
  • 谢谢 Remy 我认为是这样。 Baum 我不知道这是一个设计缺陷吗?在这种情况下,先前返回的字符串并不重要,因为就用户而言,只有最后的编译日志才会被计算在内。用户会编写一个着色器,如果有错误会通知他。

标签: c++ arrays string pointers


【解决方案1】:

让我们看看这段代码:

const char * getInfoLogFunction()
{
    static char buffer[4096];
    glGetShaderInfoLog(shader, 4096, NULL, buffer);

    const char * compileStatus = buffer; // <--- Here
    return compileStatus; 
}

这个函数返回compileStatus,它是一个指向buffer的指针。结果,每次调用此函数时,都会返回指向同一字符缓冲区的指针。所以,例如,如果我说

const char* call1Result = getInfoLogFunction();

// Time passes, then...
const char* call2Result = getInfoLogFunction();

我将有两个指向同一个缓冲区的指针,因此call1Result 指向的字符串将与call2Result 指向的字符串完全相同。例如,如果我想随时间存储所有日志的副本,这可能会导致真正的问题。

解决此问题的一种简单方法是让函数返回一个std::string,这会生成用于初始化它的字符串的深层副本。这意味着将来对getInfoLogFunction 的调用将不会共享相同的底层缓冲区。然后,您可以使用 string::c_str() 成员函数将其传递给 Python,获取原始 C 样式数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2012-11-30
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多