【问题标题】:Storing lines of input into a vector将输入行存储到向量中
【发布时间】:2016-02-08 07:00:59
【问题描述】:

在我的程序中,我试图从用户输入行中获取实际名称,然后将它们存储到向量中。

我编写了自己的代码,但运行时错误告诉我“字符串下标超出范围”。

这是我的代码

const int LEN = 100;
struct Case{
public:
int No_People;
vector<string> Names;
vector<string> Results;
void Set_Data(){
    cin >> No_People;
    int Size = No_People;
    char Line[LEN];
    for (int i = 0; i < Size; i++){
        cin.getline(Line, LEN);
        Names.push_back(Line);
    }
  }
}

【问题讨论】:

  • 为什么你的字符串使用字符数组而不是 std::string 呢?使用std::stringstd::getline。也不需要临时变量Size,可以直接使用No_People
  • 至于你的错误,哪里你得到错误?您在代码的哪一行显示?
  • 选择您标记的语言之一......
  • @JoachimPileborg 如果我只使用字符串而不是 char 数组,我得到一个错误,无法将参数 1 从字符串转换为 char*。我认为这是因为 getline 函数将数组的 char 作为参数。这是一个运行时错误,我已经编辑了帖子。
  • @MahmoudAnwer,请参阅下面的答案以获得解释。

标签: c++


【解决方案1】:

我个人会定义一个类来表示一条线。然后你可以使用流迭代器来加载向量。

class Line
{
    std::string   line;
    public:
        // Operator to convert a line back to a std::string
        operator std::string const&() const {return line;}

        // Friend function to read a line from a stream.
        friend std::istream& operator>>(std::istream& in, Line& data)
        {
            return std::getline(in, data.line);
        }
 };

 int main()
 {
     int countOfPeople;
     std::cin >> countOfPeople;

     std::vector<std::string>  lines;
     std::copy_n((std::istream_iterator<Line>(std::cin)), countOfPeople,
                 std::back_insert_iterator(lines));
 }

【讨论】:

    【解决方案2】:

    没有必要使用char[] 数组,而是使用std::string,特别是考虑到您已经在使用它。

    OP 备注:cin.getline() 是这个:

    std::istream::getline(char*, int)

    std::string 需要使用的是这个:

    std::getline(istream&amp;, string&amp;)

    struct Case{
    public:
        int Size;
        vector<string> Names;
        vector<string> Results;
        void Set_Data(){
            std::string temp;
            cin >> Size; cin.ignore();
            for (int i = 0; i < Size; i++){
                std::getline(cin, temp);
                Names.push_back(temp);
            }
        }
    }
    

    就编译错误而言,总是:

    • 引用确切的错误消息
    • 告诉它发生在哪一行
    • 显示包含该行的代码和相关的类/方法

    【讨论】:

    • 我在一个新项目中尝试了你的代码,没关系,但如果我输入的大小为 2,它只接受一行输入注意:输入行包含类似于“hello world”的空格跨度>
    • @MahmoudAnwer 已经修复,对错误深表歉意。看上面。添加了cin.ignore()。参考:stackoverflow.com/questions/18786575/using-getline-in-c
    【解决方案3】:

    很可能您正在使用超出索引的下标访问字符串。如果您指出错误发生在哪一行,将很容易回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多