首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++对象数组,初始化失败

c++对象数组,初始化失败
EN

Stack Overflow用户
提问于 2015-03-28 23:43:23
回答 2查看 170关注 0票数 0

需要使用类对象数组为学校做一个项目。我们不能使用向量,所以任何建议它们的答案都不会有帮助。我一直试图创建这样的数组,然后在每个对象中添加一个名称。我尝试运行一个for循环来完成这个任务,并且它一直跳过数组中的第一个对象。帮助?

代码语言:javascript
复制
#include <iostream>
#include <cstring>

using namespace std;

class Car
{
  private:
  char* driver;

  public:

  void setDriver(char* name)
  { 
     driver = name;
  }

  void getDriver()
  {
    cout<<driver;
  }

};

int main()
{

int numDrivers;
cout<<"How many drivers would you like?";
cin>>numDrivers;

Car* roster = new Car[numDrivers];

for(int i=0;i<numDrivers;i++)
{
  char* name;
  name = new char[20];
  cout<<"name:";
  cin.getline(name, 20);

  roster[i].setDriver(name);
}

for(int i=0;i<numDrivers;i++)
{
  roster[i].getDriver();
  cout<<".\n";
}
  return 0;
}

我一直在玩for循环的范围,当它点击循环来设置驱动程序的名称时,它仍然会做同样的事情。看起来像这样

代码语言:javascript
复制
How many drivers would you like?: 4
name:name: name1
name: name2
name: name3
.
name1.
name2.
name3.

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-28 23:59:21

根据评论,同样的问题在cin and getline skipping input中得到了回答

这对代码的确切影响方式如下所示。执行这些行可以从输入中读取数字4(例如):

代码语言:javascript
复制
cout<<"How many drivers would you like?";
cin>>numDrivers;

>>运算符从cin中读取足够多的字符,以确定其中有一个数字4(该数字以4结尾)。它不会再读了,所以你可能在那行上输入的任何东西都会在那里。如果您在"4“之后立即按下”返回“键,那么行上唯一剩下的是结束行的换行符,但它仍然存在。

下一个与用户的交互是在输入循环期间,当i0时。此代码执行:

代码语言:javascript
复制
  cout<<"name:";
  cin.getline(name, 20);

因此,程序将“名称”打印到控制台,并等待某个输入被换行符终止。但是已经有这样的输入等待被读取(从cin>>numDrivers遗留下来)。因此,程序在回车中读取它之前没有的任何内容。它将此处理为空字符串,并继续循环的第二次迭代。

票数 2
EN

Stack Overflow用户

发布于 2015-03-29 00:18:02

问题似乎是你在行中有一个‘悬空’\n换行符

代码语言:javascript
复制
cin>>numDrivers;

上面的代码不使用新的行字符。所以当代码到达

代码语言:javascript
复制
cin.getline(name, 20);

它以一行的形式使用新行字符并移动一行。

修复方法是在第一次调用cin之后忽略所有字符,如下所示

代码语言:javascript
复制
void ignore_line ( std::istream& in )
{
    in.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
}

int main()
{

    int numDrivers;
    cout<<"How many drivers would you like?";
    cin>>numDrivers;
    ignore_line(cin);  // Consume newline

    Car* roster = new Car[numDrivers];

    for(int i=0;i<numDrivers;i++)
    {
        char* name;
        name = new char[20];
        cout<<"name:";
        cin.getline(name, 20);

        roster[i].setDriver(name);
    }

    for(int i=0;i<numDrivers;i++)
    {
        roster[i].getDriver();
        cout<<".\n";
    }
    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29323963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档