如何声明一个与已知 const 字符串长度相同的新字符串?
How do I declare a new string the same length of a known const string?
我一直在使用:
string letters = THESAMELENGTH; // Assign for allocation purposes.
原因是,如果我:
string letters[THESAMELENGTH.length()];
我收到一个非常量表达式投诉。
但是如果我:
string letters[12];
如果指南常量字符串大小发生变化,我将面临需要更改每个实例的风险。
但是当我不使用这些条目时分配一个字符串似乎很愚蠢,我只希望我新分配的字符串与之前分配的 const 字符串长度相同,然后填充不同的值。
您如何建议我优雅、安全地执行此操作?
你可以
string letters(THESAMELENGTH.length(), ' '); // constructs the string with THESAMELENGTH.length() copies of character ' '
顺便说一句:string letters[12];
并不像您预期的那样。它声明了一个包含 12 个元素的 string
的原始数组。
I only want my newly assigned string to be the same length as the previously assigned const string, then fill with different values.
string
class/type 存在的部分原因是您不必担心试图管理它的长度。 (char
数组的问题。)
如果你有一个 const std::string tmp
那么你不能在它已经初始化后就给它分配任何东西。例如:
const std::string tmp = "A value"; // initialization
tmp = "Another value"; // compile error
How do you recommend I do this gracefully and safely?
如果您真的想将字符串保持在特定大小,而不管其内容如何,您总是可以 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
的 length/size 并且超出末尾的任何内容都会得到 t运行cated。
这个例子来自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
您不能只在编译时询问字符串 变量 的长度。根据定义,不可能知道 变量 的值,或者任何给定程序的 状态 的值,而它不是 运行宁。这个问题只在 运行-时间有意义。
其他人也提到了这一点,但是您对string letters[12];
的理解似乎有问题。这给你一个 string
类型的数组,即你得到 space 12 个完整的字符串(例如 words/sentences/etc),而不仅仅是字母。
换句话说,你可以这样做:
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
s 管理他们自己的长度。例如,如果 string
值实际上比你的限制短,你会导致你的变量使用比需要更多的 space/memory,如果它更长,你仍然 t运行照顾它。两种副作用都不好,恕我直言。
您需要做的第一件事是了解字符串长度和数组维度之间的区别。
std::string letters = "Hello";
创建一个包含来自 "Hello"
的字符且长度为 5
.
的单个 string
比较
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
分配超出其需要的部分(例如,为其长度的多次增加做好准备)。
我一直在使用:
string letters = THESAMELENGTH; // Assign for allocation purposes.
原因是,如果我:
string letters[THESAMELENGTH.length()];
我收到一个非常量表达式投诉。
但是如果我:
string letters[12];
如果指南常量字符串大小发生变化,我将面临需要更改每个实例的风险。
但是当我不使用这些条目时分配一个字符串似乎很愚蠢,我只希望我新分配的字符串与之前分配的 const 字符串长度相同,然后填充不同的值。
您如何建议我优雅、安全地执行此操作?
你可以
string letters(THESAMELENGTH.length(), ' '); // constructs the string with THESAMELENGTH.length() copies of character ' '
顺便说一句:string letters[12];
并不像您预期的那样。它声明了一个包含 12 个元素的 string
的原始数组。
I only want my newly assigned string to be the same length as the previously assigned const string, then fill with different values.
string
class/type 存在的部分原因是您不必担心试图管理它的长度。 (char
数组的问题。)
如果你有一个 const std::string tmp
那么你不能在它已经初始化后就给它分配任何东西。例如:
const std::string tmp = "A value"; // initialization
tmp = "Another value"; // compile error
How do you recommend I do this gracefully and safely?
如果您真的想将字符串保持在特定大小,而不管其内容如何,您总是可以 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
的 length/size 并且超出末尾的任何内容都会得到 t运行cated。
这个例子来自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
您不能只在编译时询问字符串 变量 的长度。根据定义,不可能知道 变量 的值,或者任何给定程序的 状态 的值,而它不是 运行宁。这个问题只在 运行-时间有意义。
其他人也提到了这一点,但是您对string letters[12];
的理解似乎有问题。这给你一个 string
类型的数组,即你得到 space 12 个完整的字符串(例如 words/sentences/etc),而不仅仅是字母。
换句话说,你可以这样做:
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
s 管理他们自己的长度。例如,如果 string
值实际上比你的限制短,你会导致你的变量使用比需要更多的 space/memory,如果它更长,你仍然 t运行照顾它。两种副作用都不好,恕我直言。
您需要做的第一件事是了解字符串长度和数组维度之间的区别。
std::string letters = "Hello";
创建一个包含来自 "Hello"
的字符且长度为 5
.
string
比较
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
分配超出其需要的部分(例如,为其长度的多次增加做好准备)。