Я чувствую себя немного запоздалым, отправляя это, но я понятия не имею, почему моя программа взрывается, когда она читает строковый литерал с клавиатуры (то есть назначая его указателю).
Отладка длилась более часа и программа продолжает взрываться при чтении с клавиатуры.
Я перепробовал все, чтобы это исправить. Инициализация строки строковым литералом (т. Е. Компилятор сказал, что у него есть проблема с 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
Размещенный вами код неполон, но я не вижу, чтобы вы выделяли fileName перед вызовом std::cin.getline(fileName, 256)
,
Я тебя нигде не вижу вызов GetFile
но похоже, что он ожидает либо выделенный буфер, либо массив char. В main()
Вы объявляете char *fileName
но не выделяйте на это память. Если вы звонили (из main()
) GetFile(fileName)
тогда я ожидал бы, что это потерпит крах. Вам либо нужно выделить место в main()
или в GetFile()
для чтения данных.
Передача строкового литерала для заполнения не имеет никакого смысла. Вам нужно передать буфер:
#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;
}
cin :: getline () не выделяет память для хранения строковых литералов в fileName
, Вы должны предоставить пространство памяти для этого, выделив память для fileName
, как
fileName = new char[_MAX_PATH];
наконец, не забудьте освободить память
delete[] fileName;