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

新手上路,请多包涵

我一直在使用:

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

原因是,如果我:

 string letters[THESAMELENGTH.length()];

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

但如果我:

 string letters[12];

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

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

你如何建议我优雅而安全地做到这一点?

原文由 Georgina Davenport 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 341
2 个回答

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

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

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

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

你如何建议我优雅而安全地做到这一点?

如果您真的想将字符串保持为特定大小,无论其内容如何,您都可以始终 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 并且超出末尾的任何内容都会被截断。

此示例来自 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

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

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

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

 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];
// ...

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

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

原文由 code_dredd 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以

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

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

原文由 songyuanyao 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题