控制台中的新结构崩溃,原因
new structure crashing in console, why?
只有当我要求用户在名称之前输入披萨直径时,这才会使控制台崩溃。
如果我问披萨的名字,然后问披萨的直径和重量,这似乎很好——我不明白为什么。
#include <iostream>
using namespace std;
struct pizza_structure
{
double diameter;
char name[100];
double weight;
};
int main()
{
pizza_structure * ps = new pizza_structure;
cout << "Enter pizza diameter: ";
cin >> ps->diameter;
cout << "Enter pizza name: ";
cin.get(ps->name, 100);
cout << "Enter pizza weight: ";
cin >> ps->weight;
cout << "Name: " << ps->name << ", diameter: " << ps->diameter << ", weight: " << ps->weight;
delete[] ps;
cin.get();
cin.get();
return 0;
}
您在使用cin >> ...
格式化和使用cin.get(...)
未格式化之间混合输入类型
这是"错误的",因为格式化的输入将换行符留在输入缓冲区中,然后将其作为cin.get(...)
的第一个字符读取,这意味着字符串为空,然后当您读取weight时,它无法正确读取。
您需要使用备用cin.get()
读取额外的换行符[并希望用户没有在输入中添加一些非数字字符],或者使用getline
手动解析输入并自己拆分行[例如使用stringstream
从行中读出数字]。
商业级UI肯定会使用自定义读取功能,当涉及到输入错误时,这些功能更有意义。
正如其他人所说,delete []
是错误的——事实上,对于这样一个小的结构,首先没有理由使用new
。
相关文章:
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- Qt5 C++ 应用程序因未知原因崩溃
- exc_breakpoint崩溃的原因
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 如何调查应用程序崩溃的原因
- 程序崩溃的原因可能是什么,恕不另行通知
- 无法弄清楚导致此崩溃的原因(SIGABRT)
- 由于某种原因,FSTREAM测试程序崩溃
- 为什么将对象从一个智能指针移至另一个原因崩溃
- 找不到崩溃原因
- 可能导致std::difftime创建SIGBUS崩溃的原因
- C++程序由于某种未知原因而崩溃
- Kinect SDK 在后台线程上崩溃,原因不明
- C++-映射迭代器中的if语句导致程序崩溃的原因
- C++编译崩溃与未知原因-神话电视补丁
- 使用Armadillo类型的lambda函数崩溃的未知原因
- 程序崩溃的原因
- 克鲁斯卡尔算法代码因未知原因而崩溃
- 堆自由() 崩溃的可能原因
- 通过在 C++ 中使用发布模式二进制文件获取崩溃原因