这个简单(?C++字符串声明问题似乎已经击败了StackExchange

This simple(?) C++ string declaration issue appears to have defeated StackExchange?

本文关键字:StackExchange 问题 简单 C++ 声明 字符串      更新时间:2023-10-16

Edit3:我打算回到这个问题来简化问题,并浏览相同的答案不断重复出现的回答列表,以解释为什么它们不起作用。

编辑:解释

为什么问题是唯一的:问题的其他答案都没有回答问题。这个问题没有答案。基本上我可以表达它:

  1. 有一个常量字符串 = "Hello";
  2. 如何在编译时获取字符串长度?

编辑2:我在这里再次问了这个问题,因为我被不起作用的解决方案淹没了。我对重复解释为什么它们不起作用感到筋疲力尽。唯一有效的答案正是我来这里寻找更好的方法之前所拥有的。

我无法更改的基本场景是这样的:

我有一个字符串声明(它是这样强制的):

const string LETTERS = "Random Sentence";

接下来,我需要对字符串执行一系列单独的操作。

因此,我正在做的是尝试声明第二个可变字符串作为这些操作结果的容器:

例如字符串字母顺序[15];

但是,这是不明智的。如果这是一个很长的程序并且我更改了候选 LETTERS,那么我一定不要忘记手动将 15 更改为新值。如果有几个案例,则容易发生事故。

我想做的是这样的:

int size = (int)LETTERS.length();
string alphabeticised[size];

但这是无效的,原因有两个:

  1. 它会创建一个字符串数组,它不会设置一个字符串的长度。
  2. 无论如何,它
  3. 不会在编译时计算,因此当我尝试编译它时它会抛出一个非常量表达式错误,因为它还没有替换值。

一些建议使用 constexpr,这会有所帮助,除了它必须针对 MSVC 2012 编译的事实,这基本上将我限制为 c++98 约定。无论如何,我不能在 MSVC 2012 中使用 constexpr。

此外,出于类似的原因,我想在将对字符串进行操作的循环中使用此大小,例如:

for ( int x = 0; x < LETTERS.length(); x++ ) {
    // Do stuff, for random example:
    incremented[x] = ++LETTERS[x];
}

不过,我不应该:需要在运行时找到 LETTERS.length!我已经知道每次都会是什么。

那么,如何在编译时发现和使用字符串长度,这样我就不必在运行时找到它呢?

警告:

该解决方案必须针对 MSVC 2012 进行编译,MSVC 2012 大致符合 c++98,并且具有非常少的 C++11 功能,甚至没有 constexpr。

此外,我

无法访问调试器,因此我无法像在类似问题中一样找到编译器是否有子字母。Length() 表示常量表达式。

简而言之,如何针对 MSVC 2012 在编译时声明一个与已知长度的常量字符串长度相同的新字符串?

看起来就是这么简单!人们必须一直这样做吗?为不可变数组上的操作结果分配一些易失性内存?

我在那里没有看到任何问题?

string incremented = LETTERS;  // modifiable string of exactly the same length as LETTERS
// or
string incremented(LETTERS.length(), 0);
for ( int x = 0; x < LETTERS.length(); x++ ) {
    // Do stuff, for random example:
    incremented[x] = LETTERS[x] + 1;
}

甚至可以在 MSVC 2008 中编译。

如果您对在堆上分配可修改字符串这一事实感到困扰,请考虑原始 LETTERS 字符串也在堆上分配(以及复制到分配的内存中的 C 文本)。除非实现了小字符串优化,并且在堆栈上分配了原始字符串的内存(在这种情况下,第二个可修改字符串的内存也将在堆栈上分配)。

要在不预先初始化任何内容的情况下进行分配,您也可以执行以下操作:

string incremented;
incremented.reserve(LETTERS.length());
for ( int x = 0; x < LETTERS.length(); x++ ) {
    // Do stuff, for random example:
    incremented += LETTERS[x] + 1;
}