-3

我觉得这个帖子有点迟钝,但我不知道为什么我的程序在从键盘读取字符串文字时会爆炸(即,然后将其分配给指针)。

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

我已经尝试了一切来解决这个问题。将字符串初始化为字符串文字(即编译器说它有 nullptr 的问题)。这几乎就像我在某个地方有一个看不见的角色。如果有人能告诉我我做错了什么,我将不胜感激。

主文件

#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

您发布的代码不完整,但我没有看到您在调用std::cin.getline(fileName, 256).

于 2013-03-07T02:13:11.547 回答
1

我没有看到你打电话 GetFile的任何地方,但看起来它需要一个分配的缓冲区或一个字符数组。在main()您声明 achar *fileName但不为其分配任何内存。如果您致电 (from main()) GetFile(fileName),那么我预计它会崩溃。您要么需要分配空间,要么需要分配空间main()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.

更好的是使用 astd::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 回答