如何将cin >>与已初始化的char *一起使用为NULL

时间:2019-01-04 12:28:36

标签: c++ oop

我是OOP编程的新手,我需要一些作业方面的帮助。 我需要使用cin >>输入char *,但是当我将char *初始化为NULL时,它会中断并给我抛出“ _Str was nullptr”的异常,我该怎么办才能解决此问题? 我正在使用具有受保护成员的类,我尝试过改用公共程序,但无济于事。 正如我所说的,我对此很陌生,如果我没有正确解释,请原谅。

“ Book a”下面的代码正常工作。

class Book
{
protected:
char* title;
char* firstName;
char* lastName;
char* company;
int pages;
float price;
}

我参数化的构造函数看起来像这样

Book(const char* title, const char* firstName, const char* lastName, const char* company, int pages, float price)
{
    this->title = new char[strlen(title) + 1];
    strcpy(this->title, title);
    this->fistName = new char[strlen(firstName) + 1];
    strcpy(this->firstName, firstName);
    this->lastName = new char[strlen(lastName) + 1];
    strcpy(this->lastName, lastName);
    this->company = new char[strlen(company) + 1];
    strcpy(this->company, company);
    this->pages = pages;
    this->price = price;
}

int main()
{
Book a("TESTtitle", "TESTfirstName", "TESTlastName", "TESTcompany", 365, 50);
a.print();
Book c;
char* title=NULL;
char* firstName=NULL;
char* lastName=NULL;
char* company=NULL;
int pages;
float price;
cin >> title;
cin >> firstName;
cin >> lastName;
cin >> company;
cin >> pages;
cin >> price;
}

2 个答案:

答案 0 :(得分:1)

由于这个问题被标记为C ++,因此您应该对指针进行三思。高级C ++程序应避免使用Rawe指针:引用,智能指针和标准容器应足够。

如果要在后台查看,必须看到一个指针作为地址:除非指针指向有效的对象,否则您将无法对其进行任何操作。在这里,您已将指针初始化为NULL,因此您无法取消引用它们。使用它们之前,必须为它们分配有效的字符数组

#define SIZE 32
char cTitle[SIZE];
char *title = cTitle;

但是请记住:这是相当C的代码,除非必须连接C代码或正在构建自定义的低级对象,否则不要使用它。

答案 1 :(得分:1)

您使用 @Stateless() @LocalBean @TransactionAttribute(TransactionAttributeType.NEVER) public class BatchService{ @EJB private PersonService personService; public void run(List<Person> personList) { int totalEventSize = personList.size(); int quotient = totalEventSize / 100000; int modulo = totalEventSize % 100000; int totalIterations = quotient + (modulo != 0 ? 1 : 0); int startCount = 0; int endCount = 0; for (int i = 1; i <= totalIterations; i++) { if (i == totalIterations) { endCount = totalEventSize; } else { endCount = startCount + 100000; } List<Person> subList = personList.subList(startCount, endCount); personService.create(subList); startCount = endCount; } } } @Stateless @LocalBean public class PersonService implements Serializable { @EJB private PersonDLService personDLService; public void create(List<Person> list) { try { personDLService.createPerson(list); } catch (RuntimeException e) { e.printStackTrace(); } } } @Stateless @LocalBean @TransactionAttribute(TransactionAttributeType.MANDATORY) public class PersonDLService implements Serializable { private static final long serialVersionUID = 1L; @PersistenceContext(unitName = Constants.PERSISTENCE_UNIT_NAME) private transient EntityManager entityManager; public void createPerson(List<Person> personObj) { for (int i = 0; i < personObj.size(); i++) { entityManager.persist(personObj.get(i)); if (i % 2000 == 0) { entityManager.flush(); entityManager.clear(); } } System.out.println("***************** COMMITED ****************" + personObj.size()); } } 的方式与使用std::string的方式几乎相同(但必须int是定义,它不是关键字)。通常也最好接受任何#include来输出,而不是总是接受std::ostream。请注意,std::couta bad idea

using namespace std