Смущающая ошибка при чтении строкового литерала в указатель

Я чувствую себя немного запоздалым, отправляя это, но я понятия не имею, почему моя программа взрывается, когда она читает строковый литерал с клавиатуры (то есть назначая его указателю).

Отладка длилась более часа и программа продолжает взрываться при чтении с клавиатуры.

Я перепробовал все, чтобы это исправить. Инициализация строки строковым литералом (т. Е. Компилятор сказал, что у него есть проблема с 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

-3

Решение

Размещенный вами код неполон, но я не вижу, чтобы вы выделяли fileName перед вызовом std::cin.getline(fileName, 256),

2

Другие решения

Я тебя нигде не вижу вызов GetFile но похоже, что он ожидает либо выделенный буфер, либо массив char. В main() Вы объявляете char *fileName но не выделяйте на это память. Если вы звонили (из main()) GetFile(fileName) тогда я ожидал бы, что это потерпит крах. Вам либо нужно выделить место в main() или в GetFile() для чтения данных.

1

Передача строкового литерала для заполнения не имеет никакого смысла. Вам нужно передать буфер:

#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;
}
0

cin :: getline () не выделяет память для хранения строковых литералов в fileName, Вы должны предоставить пространство памяти для этого, выделив память для fileName, как

fileName = new char[_MAX_PATH];

наконец, не забудьте освободить память

delete[] fileName;
0
По вопросам рекламы [email protected]