2013-03-07 60 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

它不是一個字符串來釋放內存,除非它是一個字符串出現在源代碼中。 – 2013-03-07 02:11:31

+0

你需要做'char fileName [255];'所以它有一個放置字符串的地方。 – Patashu 2013-03-07 02:12:15

+2

我懷疑'std :: cin.getline(fileName,256);'馬上。但是你甚至不顯示它是如何被使用的。最小的例子重現問題在哪裏? – 2013-03-07 02:12:31

回答

2

的代碼,你甲肝發佈的郵件不完整,但在調用std::cin.getline(fileName, 256)之前我沒有看到您分配fileName。

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 2013-03-07 03:09:47

+0

@ MrPickle5:樂於助人。 [當你決定哪個答案對你最有幫助時,通過點擊答案左邊的複選框大綱將其標記爲已接受答案。](http://stackoverflow.com/faq/#howtoask) – Johnsyweb 2013-03-07 04:11:42

0

CIN ::函數getline()爲你的字符串常量存儲到fileName不分配內存。你必須爲它提供存儲空間,通過分配內存fileName,就像

fileName = new char[_MAX_PATH]; 

最後,不要忘記

delete[] fileName; 
+0

'malloc()'和'free()'?這個問題不是標記[標籤:C + +]? – Johnsyweb 2013-03-07 02:28:23

+0

C++不會拒絕'malloc'&'free',它是多範式的。然而,'new'&'free'應該是更好的選擇:-) – 2013-03-08 07:09:58

+0

不拒絕這些函數並不意味着它們是慣用的C++。編輯時使用'new'更接近C++風格,但這需要與'delete []'結合使用。由於你知道編譯時的大小,因此在我的答案中分配堆棧中的內存會更有意義。 – Johnsyweb 2013-03-08 08:00:54

相關問題