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

时间:2016-03-20 03:33:19

标签: c++ string assignment-operator

我一直在使用:

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

原因是,如果我:

string letters[THESAMELENGTH.length()];

我得到一个非常表达的抱怨。

但如果我:

string letters[12];

如果指南const字符串改变大小,我有可能需要更改每个实例。

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

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

3 个答案:

答案 0 :(得分:4)

你可以

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

BTW:string letters[12];并不代表您的预期。它声明了一个string数组,包含12个元素。

答案 1 :(得分:3)

  

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

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

如果您有const std::string tmp,那么在初始化之后您不能只为其分配任何内容。 E.g:

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字符串的长度/大小为// 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 ,超出结尾的任何内容都会被截断。

此示例来自C++ Reference

string letters[12];

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

其他人已经提到了这一点,但您对string的理解似乎存在问题。这会给你一组for(size_t i = 0; i < letters.size(); ++i) letters[i] = "Hello, world!"; 类型,即你可以获得12个完整字符串的空间(例如单词/句子/等),而不仅仅是字母。

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

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管理自己的长度。例如,如果extern unsigned char LCD[][64]; 值实际上比您的限制短,则会导致变量使用比所需更多的空间/内存,如果更长,则仍然会截断它。没有副作用,恕我直言。

答案 2 :(得分:1)

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

  std::string letters = "Hello";

创建一个string,其中包含"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分配超出其需要的数量(例如,为其长度的多次增加做好准备)。