【问题标题】:string literal combination for colorized readline with string variable带有字符串变量的彩色 readline 的字符串文字组合
【发布时间】:2018-01-08 19:31:27
【问题描述】:

是否可以将变量text_info 放在颜色之间的 readline 中?
GCC 调试器给了我这个错误:" error: expected ‘)’ before 'text'

#include <readline/readline.h>

#define CYELLOW "\001\e[0;31m\002"
#define RESET   "\001\e[0m\002"

int main(int argc, char **argv)
{
    char *text_info = "its very simple string";
    readline(CYELLOW text_info RESET);
    return 0;
}

我知道下面的方法可行,但事实并非如此。

int main(int argc, char **argv)
{
    readline(CYELLOW "simple string" RESET);
    return 0;
}

【问题讨论】:

  • 您可以连接常量,但不能连接这样的变量。另外应该是char* text_info
  • 如果text_info 部分是变量,而不是字符串文字,您可以使用sprintf 来构建字符串。
  • 好的,所以唯一的解决方案就是构建字符串,对吧?
  • 你可以使用char *text_info = CYELLOW "it's a very simple string" RESET; readline(text_info);

标签: c readline


【解决方案1】:

您发布的行不起作用,因为它在构建期间无法合并:

readline(CYELLOW text_info RESET);

正如@Weaterh Vane 在上面的评论中已经提到的那样,唯一真正的解决方案是在运行时通过sprintf 或更好的snprintf 构建字符串。

 char aBuffer[100];
 snprintf(aBuffer, sizeof(aBuffer), "%s%s%s", CYELLOW, text_info, RESET);

编辑:请记住,上面示例中的aBuffer 可能很小(取决于text_info 的长度)。根据您的应用程序,您可以只增加 100 的大小或动态分配缓冲区。

【讨论】:

  • 或:snprintf(aBuffer, sizeof(aBuffer), CYELLOW "%s" RESET, text_info);
【解决方案2】:

在工作代码中,这一行

readline(CYELLOW text_info RESET);

被宏扩展为

readline("\001\e[0;31m\002" "simple string" "\001\e[0m\002");

反过来,在字符串文字组合结束后

readline("\001\e[0;31m\002simple string\001\e[0m\002");

包含一个简单的字符串文字。不涉及任何运算符,但它仍然作为函数的单个参数结束。

与此相反,这一行

readline(CYELLOW text_info RESET);

被宏扩展为

readline("\001\e[0;31m\002" text_info "\001\e[0m\002");

它不受字符串文字组合的影响,因此以三个字符串表达式结束(即不完全是文字字符串,一个是非文字字符串,一个指向字符的指针),两者之间没有任何运算符。

此外,字符串连接没有简单的运算符(字符串文字组合之外的情况)。

因此,为了提供单个字符串参数(“字符串”,如“C 兼容的零终止字符序列,可能是数组”),您必须构造这样的字符串,然后将其用作功能。

正如 Weather Vane 所提议的,sprintf() 可能是实现此目的的工具。

【讨论】:

    猜你喜欢
    • 2015-08-09
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多