C++ 如何声明与已知常量字符串长度相同的新字符串?
我一直在使用:C++ 如何声明与已知常量字符串长度相同的新字符串?,c++,string,assignment-operator,C++,String,Assignment Operator,我一直在使用: string letters = THESAMELENGTH; // Assign for allocation purposes. 原因是,如果我: string letters[THESAMELENGTH.length()]; 我得到一个非经常性的抱怨 但如果我: string letters[12]; 如果guide const字符串改变大小,我就有可能需要更改每个实例 但在我不使用这些条目的情况下分配字符串似乎很愚蠢,我只希望新分配的字符串与以前分配的常量字符串长度
string letters = THESAMELENGTH; // Assign for allocation purposes.
原因是,如果我:
string letters[THESAMELENGTH.length()];
我得到一个非经常性的抱怨
但如果我:
string letters[12];
如果guide const字符串改变大小,我就有可能需要更改每个实例
但在我不使用这些条目的情况下分配字符串似乎很愚蠢,我只希望新分配的字符串与以前分配的常量字符串长度相同,然后用不同的值填充
您建议我如何优雅而安全地进行此操作?您可以
string letters(THESAMELENGTH.length(), ' '); // constructs the string with THESAMELENGTH.length() copies of character ' '
顺便说一句:字符串字母[12]代码>的意思与您预期的不同。它声明一个字符串数组,包含12个元素。您可以
string letters(THESAMELENGTH.length(), ' '); // constructs the string with THESAMELENGTH.length() copies of character ' '
顺便说一句:字符串字母[12]代码>的意思与您预期的不同。它声明了一个字符串数组,包含12个元素
我只希望新分配的字符串与以前分配的常量字符串长度相同,然后用不同的值填充
字符串
类/类型存在的部分原因是,您不必担心如何管理其长度。(字符数组的问题)
如果您有一个const std::string tmp
,那么您不能在初始化之后为它分配任何内容。例如:
const std::string tmp = "A value"; // initialization
tmp = "Another value"; // compile error
你建议我如何优雅而安全地做这件事
如果您真的想将字符串保持在特定的大小,而不管其内容如何,您可以始终调整您的字符串变量的大小。例如:
// 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\u string\u length
,超出末尾的任何内容都将被截断
这个例子来自
因此,应将字母
变量重命名为更准确的值(例如单词
)
如果您确实想要字母(例如,单个字符串上的完整字母表),可以执行以下操作:
// 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
s管理自己的长度。例如,如果字符串
值实际上比您的限制短,则会导致变量使用的空间/内存超过需要的空间/内存,如果它更长,则仍会截断它。两种副作用都不好,伊姆霍
我只希望新分配的字符串与以前分配的常量字符串长度相同,然后用不同的值填充
字符串
类/类型存在的部分原因是,您不必担心如何管理其长度。(字符数组的问题)
如果您有一个const std::string tmp
,那么您不能在初始化之后为它分配任何内容。例如:
const std::string tmp = "A value"; // initialization
tmp = "Another value"; // compile error
你建议我如何优雅而安全地做这件事
如果您真的想将字符串保持在特定的大小,而不管其内容如何,您可以始终调整您的字符串变量的大小。例如:
// 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\u string\u length
,超出末尾的任何内容都将被截断
这个例子来自
因此,应将字母
变量重命名为更准确的值(例如单词
)
如果您确实想要字母(例如,单个字符串上的完整字母表),可以执行以下操作:
// 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
s管理自己的长度。例如,如果字符串
值实际上比您的限制短,则会导致变量使用的空间/内存超过需要的空间/内存,如果它更长,则仍会截断它。这两种副作用都不是好的,IMHO。您需要做的第一件事是理解字符串长度和数组维度之间的差异
std::string letters = "Hello";
创建单个字符串
,该字符串包含“Hello”
中的字符,长度为5
相比之下
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
分配超出其需要的资源(例如,为其长度的多次增加做好准备)。您需要做的第一件事是了解字符串长度和数组维度之间的差异
std::string letters = "Hello";
创建单个字符串
,该字符串包含“Hello”
中的字符,长度为5
相比之下
std::string letters[5];
创建五个不同的默认构造对象的数组,类型为std::string
。它不会创建一个包含5个字符的字符串。在做某事时不停抱怨的原因
std::string letters[THESAMELENGTH.length()];
是标准C++中的数组构造需要使用编译器已知的长度,而在运行时确定<<代码> STD::String 的长度。
如果您有一个字符串,以及如何创建另一个相同长度的字符串,您可以执行以下操作
std::string another_string(letters.length(), 'A');
whi