如何声明与已知常量字符串长度相同的新字符串?

Geo*_*ort 1 c++ string assignment-operator

我一直在使用:

string letters = THESAMELENGTH; // Assign for allocation purposes.
Run Code Online (Sandbox Code Playgroud)

原因是,如果我:

string letters[THESAMELENGTH.length()];
Run Code Online (Sandbox Code Playgroud)

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

但如果我:

string letters[12];
Run Code Online (Sandbox Code Playgroud)

如果指南 const 字符串更改大小,我将面临需要更改每个实例的风险。

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

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

son*_*yao 6

你可以

string letters(THESAMELENGTH.length(), ' '); // constructs the string with THESAMELENGTH.length() copies of character ' '
Run Code Online (Sandbox Code Playgroud)

BTW:string letters[12];和你想象的不一样。它声明了一个string,包含 12 个元素的数组。


cod*_*edd 5

我只希望我新分配的字符串与之前分配的 const 字符串长度相同,然后填充不同的值。

string类/类型存在的部分原因是您不必担心尝试管理其长度。(数组的问题char。)

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

const std::string tmp = "A value";  // initialization
tmp = "Another value";              // compile error
Run Code Online (Sandbox Code Playgroud)

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

如果你真的想保持字符串为特定大小,不管他们的内容,你总是可以resizestring变量。例如:

// 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);
Run Code Online (Sandbox Code Playgroud)

现在,您的word字符串的长度/大小为MAX_STRING_LENGTH并且超出末尾的任何内容都将被截断。

这个例子来自C++ 参考

// 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
Run Code Online (Sandbox Code Playgroud)

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

其他人已经提到了这一点,但您对string letters[12];. 这为您提供了一组string类型,即您可以获得 12 个完整字符串(例如单词/句子/等)的空间,而不仅仅是字母。

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

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

所以你的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];
// ...
Run Code Online (Sandbox Code Playgroud)

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

免责声明:请注意,我并不建议您这样做。你应该让我们string管理自己的长度。例如,如果该string值实际上比您的限制短,您将导致您的变量使用比需要更多的空间/内存,如果它更长,您仍然会截断它。恕我直言,这两种副作用都不好。