如何声明一个与已知 const 字符串长度相同的新字符串?

How do I declare a new string the same length of a known const string?

我一直在使用:

string letters = THESAMELENGTH; // Assign for allocation purposes.

原因是,如果我:

string letters[THESAMELENGTH.length()];

我收到一个非常量表达式投诉。

但是如果我:

string letters[12];

如果指南常量字符串大小发生变化,我将面临需要更改每个实例的风险。

但是当我不使用这些条目时分配一个字符串似乎很愚蠢,我只希望我新分配的字符串与之前分配的 const 字符串长度相同,然后填充不同的值。

您如何建议我优雅、安全地执行此操作?

你可以

string letters(THESAMELENGTH.length(), ' '); // constructs the string with THESAMELENGTH.length() copies of character ' '

顺便说一句:string letters[12]; 并不像您预期​​的那样。它声明了一个包含 12 个元素的 string 的原始数组。

I only want my newly assigned string to be the same length as the previously assigned const string, then fill with different values.

string class/type 存在的部分原因是您不必担心试图管理它的长度。 (char 数组的问题。)

如果你有一个 const std::string tmp 那么你不能在它已经初始化后就给它分配任何东西。例如:

const std::string tmp = "A value";  // initialization
tmp = "Another value";              // compile error

How do you recommend I do this gracefully and safely?

如果您真的想将字符串保持在特定大小,而不管其内容如何,​​您总是可以 resize 您的 string 变量。例如:

// in some constants.h file
const int MAX_STRING_LENGTH = 16;

// in other files
#include "constants.h"
// ...
std::string word = ... // some unknown string
word.resize(MAX_STRING_LENGTH);

现在您的 word 字符串将具有 MAX_STRING_LENGTH 的 length/size 并且超出末尾的任何内容都会得到 t运行cated。

这个例子来自C++ Reference

// resizing string
#include <iostream>
#include <string>

int main ()
{
  std::string str ("I like to code in C");
  std::cout << str << '\n';

  unsigned sz = str.size();

  str.resize (sz+2,'+');
  std::cout << str << '\n';

  str.resize (14);
  std::cout << str << '\n';
  return 0;
}

// program output
I like to code in C
I like to code in C++
I like to code

您不能只在编译时询问字符串 变量 的长度。根据定义,不可能知道 变量 的值,或者任何给定程序的 状态 的值,而它不是 运行宁。这个问题只在 运行-时间有意义。

其他人也提到了这一点,但是您对string letters[12];的理解似乎有问题。这给你一个 string 类型的数组,即你得到 space 12 个完整的字符串(例如 words/sentences/etc),而不仅仅是字母。

换句话说,你可以这样做:

for(size_t i = 0; i < letters.size(); ++i)
    letters[i] = "Hello, world!";

因此您的 letters 变量应该重命名为更准确的名称(例如 words)。

如果你真的想要字母(例如单个字符串上的完整字母表),你可以这样做:

// constants.h
const std::string ALPHABET_LC = "abc...z";
const std::string ALPHABET_UC = "ABC...Z";
const int LETTER_A = 0;
const int LETTER_B = 1;
// ...

// main.cpp, etc.
char a = ALPHABET_LC[LETTER_A];
char B = ALPHABET_UC[LETTER_B];
// ...

这完全取决于您需要做什么,但这可能是一个不错的选择。

免责声明: 请注意,我并不是真的建议您这样做。你应该让 strings 管理他们自己的长度。例如,如果 string 值实际上比你的限制短,你会导致你的变量使用比需要更多的 space/memory,如果它更长,你仍然 t运行照顾它。两种副作用都不好,恕我直言。

您需要做的第一件事是了解字符串长度和数组维度之间的区别。

  std::string letters = "Hello";

创建一个包含来自 "Hello" 的字符且长度为 5.

的单个 string

比较

  std::string letters[5];

创建一个包含五个不同的默认构造对象的数组,类型为 std::string。它不会创建一个包含 5 个字符的字符串。做的时候经常抱怨的原因

  std::string letters[THESAMELENGTH.length()];

是在标准C++中构造数组需要使用编译器已知的长度,而std::string的长度是在运行时确定的。

如果你有一个字符串,并且创建另一个相同长度的字符串,你可以这样做

  std::string another_string(letters.length(), 'A');

这将创建一个包含所需字母数的字符串 'A'

因为 std::string 无论如何都可以根据需要动态更改其长度,因此执行您正在寻找的内容在很大程度上是没有意义的。也没有什么可以阻止 std::string 分配超出其需要的部分(例如,为其长度的多次增加做好准备)。