【问题标题】:creating dynamic array of string c++创建字符串c ++的动态数组
【发布时间】:2012-02-15 10:42:18
【问题描述】:

我对一个非常基本的问题很了解。我想在 C++ 中动态创建一个字符串数组。

我该怎么做?

这是我的尝试:

#include <iostream>
#include <string>
int main(){
    unsigned int wordsCollection = 6;
    unsigned int length = 6;

    std::string *collection = new std::string[wordsCollection];
    for(unsigned int i = 0; i < wordsCollection; ++i){
        std::cin>>wordsCollection[i];
    }
    return 0;    
}

但它给出了以下错误

error C2109: subscript requires array or pointer type

什么是错误?

如果我从用户那里获取输入数字,我可以从std::cin 静态创建一个该大小的数组吗?

【问题讨论】:

  • 以后请选择您的代码块并使用{}按钮;这将使您的代码在问题中正确显示。
  • 您输入了wordsCollection[i] 而不是collection[i]。您不能使用动态(例如通过std::cin)获得的大小来创建静态数组。此外,由于您从未释放数组,因此数组正在泄漏。

标签: c++ arrays dynamic


【解决方案1】:

使用std::vector&lt;string&gt;std::list&lt;string&gt; 手动滚动它。

【讨论】:

  • 但真正的问题是wordsCollection应该是collection
  • 天哪,我是多么愚蠢...无论如何,谢谢...你能告诉我第二个问题的答案,我可以创建一个静态数组吗
  • 我同意,但如果您选择继续使用new std::string,完成后别忘了delete[] collection。确保每个new 都有一个delete 是个好主意
  • 您不能创建任何大小的数组,您可以在运行时获取大小。您可以创建一个指向具有 n 个元素的缓冲区的指针,该缓冲区的作用类似于数组,但您必须将其删除。这是使用 stl 容器更可取的众多原因之一。
【解决方案2】:

我认为这是一个简单的错字。 std::cin&gt;&gt;wordsCollection[i] 应该是 std::cin&gt;&gt;collection[i]

【讨论】:

    【解决方案3】:

    我认为应该是:

    std::cin >> collection[i];
    

    【讨论】:

      【解决方案4】:

      您收到此错误是因为您尝试访问 int 的元素(即 wordsCollection),而不是 int 数组(即 collection)。你应该写的是

      std::cin>>collection[i]
      

      【讨论】:

        【解决方案5】:

        您要输入:

        std::cin>>collection[i];
        

        而且你还需要delete[]collection(否则你会泄露这个内存)。

        最好使用std::vector&lt;std::string&gt; collection; 并完全避免使用原始指针:

        #include <iterator>
        #include <iostream>
        #include <string>
        #include <vector>
        
        int main()
        {
            const unsigned int wordsCollection = 6;
        
            std::vector<std::string> collection;
            std::string word;
            for (unsigned int i = 0; i < wordsCollection; ++i)
            {
                std::cin >> word;
                collection.push_back(word);
            }
        
            std::copy(collection.begin(),
                      collection.end(),
                      std::ostream_iterator<std::string>(std::cout, "\n"));
        }
        

        【讨论】:

          【解决方案6】:

          尝试以下方法:

          #include <vector>
          #include <string>
          #include <iostream>
          
          int main(int argc, char* argv[])
          {
              std::vector<std::string> myStrings;
              myStrings.push_back(std::string("string1"));
              myStrings.push_back(std::string("string2"));
          
              std::vector<std::string>::iterator iter = myStrings.begin();
              std::vector<std::string>::iterator end = myStrings.end();
              while(iter != end)
              {
                  std::cout << (*iter) << std::endl;
                  ++iter;
              }
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 2017-03-29
            • 2019-04-18
            • 1970-01-01
            • 1970-01-01
            • 2017-08-27
            • 1970-01-01
            • 2011-08-21
            • 2023-03-16
            • 1970-01-01
            相关资源
            最近更新 更多