-3

これを投稿するのは少し遅れているように感じますが、キーボードから文字列リテラルを読み取るときにプログラムが爆発する理由がわかりません(つまり、ポインターに割り当てます)。

1 時間以上デバッグしていて、キーボードから読み取るとプログラムが爆発し続けます。

これを修正するためにすべてを試しました。文字列を文字列リテラルに初期化します (つまり、コンパイラは 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;
}

プロトコル.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());
}

プロトコル.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
4

4 に答える 4

2

投稿したコードは不完全ですが、を呼び出す前に fileName を割り当てているようには見えませんstd::cin.getline(fileName, 256)

于 2013-03-07T02:13:11.547 に答える
1

あなたが呼び出し GetFileた場所はどこにもありませんが、割り当てられたバッファまたは文字の配列のいずれかを期待しているようです。main()を宣言しますが、char *fileNameメモリを割り当てません。(からmain())を呼び出した場合GetFile(fileName)、クラッシュすることが予想されます。データを読み取るために、スペースを inmain()または inに割り当てる必要があります。GetFile()

于 2013-03-07T02:13:26.123 に答える
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

さらに良いのは、 a を使用して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;
}
于 2013-03-07T02:23:07.670 に答える
0

cin::getline() は、文字列リテラルを に格納するためのメモリを割り当てませんfileName。にメモリを割り当てることにより、メモリ空間を提供する必要がありますfileName

fileName = new char[_MAX_PATH];

最後に、メモリを解放することを忘れないでください

delete[] fileName;
于 2013-03-07T02:26:14.660 に答える