【问题标题】:How do I declare a new string the same length of a known const string?如何声明一个与已知 const 字符串长度相同的新字符串?
【发布时间】:2016-07-06 17:13:03
【问题描述】:

我一直在使用:

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

原因是,如果我:

string letters[THESAMELENGTH.length()];

我收到一个非常量表达式投诉。

但如果我:

string letters[12];

如果指南 const 字符串更改大小,我有需要更改每个实例的风险。

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

您如何建议我优雅而安全地执行此操作?

【问题讨论】:

  • string letters[12],不是长度为12的字符串,是一个包含12个字符串的数组。
  • s=strdup(现有);将复制一个字符串,可以用 free(s) 删除;
  • 感谢 Vaughn,这种区别很重要,我还没有看到。我在想字符串是一个字符数组。
  • @GeorginaDavenport:单个字符串确实是一个字符数组,可以这样访问(例如char letter = word[letter_index];)。请注意char 的数组和string 的数组是不同的 b/c 它们是不同的类型。从char 类型中构建strings 很方便的事实就是这样,一种实用的方便。
  • 请不要忘记回来接受对您有用的答案。这就是我们在这里说“谢谢”的方式:)

标签: c++ string assignment-operator


【解决方案1】:

你可以

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

顺便说一句:string letters[12]; 与您预期的不同。它声明了一个string的数组,包含12个元素。

【讨论】:

    【解决方案2】:

    我只希望我新分配的字符串与之前分配的 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 值实际上比您的限制短,您会导致您的变量使用比需要更多的空间/内存,如果它更长,您仍然会截断它。两种副作用都不好,恕我直言。

    【讨论】:

    • 谢谢,这真的很有帮助。问题相当简单。我的参考字符串是 const。所以,我不认为它是一个变量,因为它的大小和内容是在编译时定义并声明为 const 的。例如常量字符串 this = "this";稍后我想声明一个与 'this' 长度相同的新字符串,但我会在其中写入不同的内容。那么,我的问题是,我应该如何声明下一个字符串与第一个字符串的长度相同?
    • @GeorginaDavenport:您可以使用旧字符串的size 在新字符串上尝试resize。例如 newstr.resize(oldstr.size()); 创建后。请注意,每次为它分配一些东西时,您都需要使用newstr.resize(oldstr.resize())。但是,对字符串执行此操作对我来说看起来并不“优雅”。它看起来更像是“代码气味”,如果我在代码审查期间看到它,我会怀疑。考虑退后几步,从远处看问题并考虑替代解决方案。
    • 谢谢_______________
    • @GeorginaDavenport:将评论移至(现已删除)帖子底部作为“免责声明”
    【解决方案3】:

    首先要了解字符串长度和数组维度的区别。

      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 分配超出其需要的内容(例如,为其长度的多次增加做准备)。

    【讨论】:

    • 我知道编译器需要一个它知道的值。从技术上讲,字符串的 .length 是已知的,因为它被声明为分配的静态常量。更好的解释是 .length 成员函数在编译时不执行。因此,当编译器正在寻找要分配的值时,没有一个。可行的是一种建立方式,因为字符串长度在编译时是恒定的,您可以替换。换句话说,一个编译时 .length 函数。没意义怎么办?如果我在没有任何数组大小值的情况下进行编译,程序就会崩溃。
    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2011-01-19
    相关资源
    最近更新 更多