这个简单(?C++字符串声明问题似乎已经击败了StackExchange
This simple(?) C++ string declaration issue appears to have defeated StackExchange?
Edit3:我打算回到这个问题来简化问题,并浏览相同的答案不断重复出现的回答列表,以解释为什么它们不起作用。
编辑:解释为什么问题是唯一的:问题的其他答案都没有回答问题。这个问题没有答案。基本上我可以表达它:
- 有一个常量字符串 = "Hello";
- 如何在编译时获取字符串长度?
编辑2:我在这里再次问了这个问题,因为我被不起作用的解决方案淹没了。我对重复解释为什么它们不起作用感到筋疲力尽。唯一有效的答案正是我来这里寻找更好的方法之前所拥有的。
我无法更改的基本场景是这样的:
我有一个字符串声明(它是这样强制的):
const string LETTERS = "Random Sentence";
接下来,我需要对字符串执行一系列单独的操作。
因此,我正在做的是尝试声明第二个可变字符串作为这些操作结果的容器:
例如字符串字母顺序[15];
但是,这是不明智的。如果这是一个很长的程序并且我更改了候选 LETTERS,那么我一定不要忘记手动将 15 更改为新值。如果有几个案例,则容易发生事故。
我想做的是这样的:
int size = (int)LETTERS.length();
string alphabeticised[size];
但这是无效的,原因有两个:
- 它会创建一个字符串数组,它不会设置一个字符串的长度。 无论如何,它
- 不会在编译时计算,因此当我尝试编译它时它会抛出一个非常量表达式错误,因为它还没有替换值。
一些建议使用 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;
}
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 这个简单(?C++字符串声明问题似乎已经击败了StackExchange