从多个字符*中提取重复的子字符*

时间:2019-04-24 20:34:35

标签: c++ char concat

我有一个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条短线的方式来最大程度地减少代码的可读性。另外,我通过将domain声明为std::string并调用.c_str()使其起作用。例如X xx = {(domain + "x").c_str()};,但这也损害了imo的可读性。

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

有关修改X的修改:

我无法修改我的代码库中很多地方使用的结构X(某种依赖性/实用性),当在其他地方使用时,也不会始终使用“ x.com/”构造它。

1 个答案:

答案 0 :(得分: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"};

为您