2013-03-07 3 views
-3

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

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

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

его не строковых литерала, если это не является строка присутствует в исходном коде. –

+0

Вам нужно сделать 'char fileName [255];' поэтому у него есть место для размещения строки. – Patashu

+2

Я подозреваю, что 'std :: cin.getline (fileName, 256);' прямо сейчас. Но вы даже не показываете, как он используется. Где минимальный пример, воспроизводящий проблему? –

ответ

2

Код, который вы ВГА e опубликовано неполно, но я не вижу, чтобы вы назначали имя файла перед вызовом std::cin.getline(fileName, 256).

1

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

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

Спасибо, ребята, и извините за глупый вопрос. Это работало. :) – MrPickle5

+0

@ MrPickle5: Приятно помочь. [Когда вы определили, какой ответ наиболее полезен для вас, отметьте его как принятый ответ, нажав на рамку в левой части ответа.] (Http://stackoverflow.com/faq/#howtoask) – Johnsyweb

0

CIN :: GetLine() не выделяет память для вас, чтобы хранить строковые литералы в fileName. Вы должны предоставить пространство памяти для него, путем выделения памяти для fileName, так же, как

fileName = new char[_MAX_PATH]; 

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

delete[] fileName; 
+0

'malloc()' и 'free()'? Разве этот вопрос не помечен тегом [tag: C++]? – Johnsyweb

+0

C++ не отклоняет 'malloc' &' free', это мультипарадигма. Однако «новый» и «свободный» должен быть лучшим выбором :-) –

+0

Не отклонять эти функции не означает, что они являются идиоматическими C++. Использование 'new', как вы отредактировали, ближе к стилю C++, но это нужно связать с' delete [] '. Поскольку вы знаете размер во время компиляции, было бы разумнее выделить память в стеке, как в моем ответе. – Johnsyweb

Смежные вопросы