我感觉半智能发布了这个,但我不知道为什么我的程序在从键盘读取字符串文字时会爆炸(即然后将其分配给指针)。
调试了一个多小时,程序在从键盘上读取时不断爆炸。
我已经尝试了一切来解决这个问题。将字符串初始化为字符串文字(即编译器说它有nullptr的问题)。这几乎就像我在某个地方有一个看不见的角色。如果有人能告诉我我做错了什么,我将非常感激。
的main.cpp
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <iostream>
#include <fstream>
#include "protocol.h"
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int menuChoice = 0;
char * fileName = nullptr;
char * byteArray = nullptr;
char * hexArray = nullptr;
int numberOfBytes = 0;
PrintMenu();
GetMenuChoice(menuChoice);
ExecuteMenuChoice(menuChoice, fileName, byteArray, hexArray, numberOfBytes);
return 0;
}
protocol.cpp
void GetFile(char * fileName)
{
//Prompt user for binary file
std::cout << "\nEnter filename: " << std::endl;
//Read in location of binary file
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.getline(fileName, 256);
std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
}
protocol.h
#ifndef PROTOCOL_H
#define PROTOCOL_H
//Function declarations
void PrintMenu();
void GetMenuChoice(int &menuChoice);
void ExecuteMenuChoice(int menuChoice, char *& fileName, char *& byteArray,
char *& hexArray, int numberOfBytes);
void NewLine();
void ThankUser();
void ErrorMessage();
#endif
答案 0 :(得分:2)
您发布的代码不完整,但在调用std::cin.getline(fileName, 256)
之前我没有看到您分配fileName。
答案 1 :(得分:1)
我没有看到你调用 GetFile
的任何地方,但看起来它需要一个已分配的缓冲区或一个char数组。在main()
中,您声明了char *fileName
但不为其分配任何内存。如果您(从main()
)GetFile(fileName)
打电话,那么我预计会崩溃。您需要在main()
或GetFile()
中分配空间来读取数据。
答案 2 :(得分:0)
传递要填充的字符串文字没有任何意义。你需要传递一个缓冲区:
#include <iostream>
#include <fstream>
#include <stdlib.h> // for _MAX_PATH
int main()
{
char filename[_MAX_PATH];
GetFile(filename);
std::cout << filename << std::endl;
}
_MAX_PATH
比对256
之类的任意值进行硬编码更有意义。
最好还是使用std::string
并完全删除这些缓冲区大小!
#include <iostream>
void GetFile(std::string& fileName)
{
std::cout << "\nEnter filename: " << std::endl;
std::getline(std::cin, fileName);
}
int main()
{
std::string filename;
GetFile(filename);
std::cout << filename << std::endl;
}
答案 3 :(得分:0)
cin :: getline()不会为您分配内存以将字符串文字存储到fileName
中。您必须为fileName
分配内存,为此提供内存空间,就像
fileName = new char[_MAX_PATH];
最后,不要忘记通过
释放内存delete[] fileName;