将字符串文字读入指针时出现令人尴尬的错误

时间:2013-03-07 02:07:35

标签: c++ pointers hexdump

我感觉半智能发布了这个,但我不知道为什么我的程序在从键盘读取字符串文字时会爆炸(即然后将其分配给指针)。

调试了一个多小时,程序在从键盘上读取时不断爆炸。

我已经尝试了一切来解决这个问题。将字符串初始化为字符串文字(即编译器说它有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

4 个答案:

答案 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;