我只希望我新分配的字符串与之前分配的 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++ 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
您不能只在编译时询问字符串变量 的长度。根据定义,不可能知道 variable 的值,或任何给定程序的 state,而它没有运行。这个问题只在运行时才有意义。
其他人已经提到了这一点,但是您对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];
// ...
这完全取决于您需要做什么,但这可能是一个不错的选择。
免责声明:请注意,我并不是真的建议您这样做。您应该让strings 管理自己的长度。例如,如果 string 值实际上比您的限制短,您会导致您的变量使用比需要更多的空间/内存,如果它更长,您仍然会截断它。两种副作用都不好,恕我直言。