带有字符串变量的彩色读取行的字符串文字组合
string literal combination for colorized readline with string variable
是否可以将变量 text_info
放入带颜色的 readline 中?
GCC 调试器给我这个错误:" error: expected ‘)’ before 'text'
#include <readline/readline.h>
#define CYELLOW "[=10=]1\e[0;31m[=10=]2"
#define RESET "[=10=]1\e[0m[=10=]2"
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;
}
您发布的行不起作用,因为它在构建期间无法合并:
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
的大小或动态分配缓冲区。
在工作代码中,这一行
readline(CYELLOW text_info RESET);
宏扩展为
readline("[=11=]1\e[0;31m[=11=]2" "simple string" "[=11=]1\e[0m[=11=]2");
反过来,在字符串文字组合结束后为
readline("[=12=]1\e[0;31m[=12=]2simple string[=12=]1\e[0m[=12=]2");
其中包含一个简单的字符串文字。不涉及运算符,但它仍然作为函数的单个参数结束。
与此相反,这一行
readline(CYELLOW text_info RESET);
宏扩展为
readline("[=14=]1\e[0;31m[=14=]2" text_info "[=14=]1\e[0m[=14=]2");
不受字符串文字组合的影响,因此以三个字符串表达式(即不完全是文字字符串,一个是非文字字符串,一个指向字符的指针)结束,中间没有任何运算符。
此外,没有用于字符串连接的简单运算符(字符串文字组合之外的情况)。
因此,为了给出单个字符串参数("string",如“C 兼容的零终止字符序列,可能是数组”),您将必须构造这样一个字符串,然后将其用作函数的单个参数。
正如 Weather Vane 所建议的那样,sprintf()
可能是执行此操作的工具。
是否可以将变量 text_info
放入带颜色的 readline 中?
GCC 调试器给我这个错误:" error: expected ‘)’ before 'text'
#include <readline/readline.h>
#define CYELLOW "[=10=]1\e[0;31m[=10=]2"
#define RESET "[=10=]1\e[0m[=10=]2"
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;
}
您发布的行不起作用,因为它在构建期间无法合并:
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
的大小或动态分配缓冲区。
在工作代码中,这一行
readline(CYELLOW text_info RESET);
宏扩展为
readline("[=11=]1\e[0;31m[=11=]2" "simple string" "[=11=]1\e[0m[=11=]2");
反过来,在字符串文字组合结束后为
readline("[=12=]1\e[0;31m[=12=]2simple string[=12=]1\e[0m[=12=]2");
其中包含一个简单的字符串文字。不涉及运算符,但它仍然作为函数的单个参数结束。
与此相反,这一行
readline(CYELLOW text_info RESET);
宏扩展为
readline("[=14=]1\e[0;31m[=14=]2" text_info "[=14=]1\e[0m[=14=]2");
不受字符串文字组合的影响,因此以三个字符串表达式(即不完全是文字字符串,一个是非文字字符串,一个指向字符的指针)结束,中间没有任何运算符。
此外,没有用于字符串连接的简单运算符(字符串文字组合之外的情况)。
因此,为了给出单个字符串参数("string",如“C 兼容的零终止字符序列,可能是数组”),您将必须构造这样一个字符串,然后将其用作函数的单个参数。
正如 Weather Vane 所建议的那样,sprintf()
可能是执行此操作的工具。