我一直在使用:
string letters = THESAMELENGTH; // Assign for allocation purposes.
原因是,如果我:
string letters[THESAMELENGTH.length()];
我得到一个非常表达的抱怨。
但如果我:
string letters[12];
如果指南const字符串改变大小,我有可能需要更改每个实例。
但是当我不使用这些条目时分配字符串似乎很愚蠢,我只希望我新分配的字符串与先前分配的const字符串的长度相同,然后填充不同的值。
你如何建议我优雅安全地做到这一点?
答案 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
分配超出其需要的数量(例如,为其长度的多次增加做好准备)。