从多个char中提取重复的子char *

问题描述 投票:0回答:1

我有一个struct,其构造函数接受char*(而不是std::string)。我想用类似的参数构造这个类的多个实例:

struct X {
  char* x;
};

// usage

X xx = {"x.com/x"};

X xy = {"x.com/y"};

X xz = {"x.com/z"};

参数有点复杂,常见的子“字符串”比“x.com/”更长,因此提取它会有助于使其更具可读性,但我不确定如何:

const static char* domain = "x.com/";

X xx = {domain + "x"};

X xy = {domain + "y"};

X xz = {domain + "z"};

我已经尝试将domain声称为std::stringchar*char[]。我也试过省略而不是省略+。我想避免创建局部变量或使用strcopy,因为我想通过在理想情况下为~3条短线添加复杂性来最小化代码可读性增益。另外,我通过宣布domainstd::string并援引.c_str()来实现它;例如X xx = {(domain + "x").c_str()};,但这也伤害了可读性imo。

我想可能的答案是我必须忍受重复子字符串或使用增加冗长的东西。但也许我的C ++无知和缺乏精确的术语意味着我在尝试搜索解决方案时错过了一些明显的东西。

关于修改X的编辑:

我不能修改我的代码库中很多地方使用的结构X(它是某种依赖/实用程序),在其他地方使用它时也不总是用“x.com/”构造。

c++ char concat
1个回答
2
投票

首先,在C ++ 03中不推荐将字符串文字分配给char*,并从C ++ 11中删除。 x应该是const char*标准投诉。

由于你无法修改X,你可以使用一个小技巧来利用在编译过程中由空格分隔的字符串文字被合并在一起的事实。这意味着如果你有

"hello " "world"

编译器会将其合并到

"hello world"

知道这一点,您可以利用预处理器来定义符号

#define DOMAIN "x.com/"

然后你可以用它来初始化你的对象

X xx = {DOMAIN "x"};

X xy = {DOMAIN "y"};

X xz = {DOMAIN "z"};

哪个得到解决

X xx = {"x.com/x"};

X xy = {"x.com/y"};

X xz = {"x.com/z"};

为了你。

© www.soinside.com 2019 - 2024. All rights reserved.