2012-02-01 59 views
0

此代碼是C/C++,並且運行時沒有警告或調試消息。我在GNU GCC編譯器中使用Code :: blocks。這個應用程序完美工作了一次,然後在我不知不覺中混淆的地方。現在每次它都會允許一個IP地址輸入,但然後凍結並關閉。爲什麼?爲什麼這個子網類應用程序凍結?

#include <iostream> 
#include <string> 
#include <cstdio> 

using namespace std; 

int ip[3]; 
char * inputIP; 
int x; 
string classValue; 

void subnetClass() 
{ 
if (x==0) classValue="Error: first octet may not be zero."; 
if (x>0 && x<=126) classValue="Class A"; 
if (x==127) classValue="Loopback Address"; 
if (x>=128 && x<=191) classValue="Class B"; 
if (x>=192 && x<=223) classValue="Class C"; 
if (x>=224 && x<=239) classValue="Class D"; 
if (x>=240 && x<=255) classValue="Class E"; 
if (x>255) classValue="Error: an octet may not be more than 255."; 

cout << classValue << endl; 
} 


int main() 
{ 
cout << "Enter IP address in dotted-decimal form." << endl; 
cin >> inputIP; 
scanf(inputIP, "%d.%d.%d.%d" , &ip[0],&ip[1],&ip[2],&ip[3]); 
int x=ip[0]; 
subnetClass(); 

return 0; 
} 

生成日誌:

檢查是否存在:C:\ IP子網的應用程序\ BIN \調試\ IP子網劃分APP.EXE

執行:「C:.. 。\ CodeBlocks/cb_console_runner.exe「」C:... \ IP subnetting app \ bin \ Debug \ IP subnetting app.exe「(在C:... \ IP子網劃分應用程序中)

進程以狀態終止-1073741510(0分27秒)

+0

請縮進。你的程序是C++或C;它不可能是兩個。 (對我來說,看起來不像C)。你是否通過調試器運行它?它如何凍結_and_關閉? – 2012-02-01 20:27:23

+1

您將字符串提取爲不存在的C風格字符串('inputIP'只是一個未初始化的指針)。 – 2012-02-01 20:29:28

+2

你聲明'int ip [3]'是一個由3個整數組成的數組(索引0..2),然後寫入數組末尾的'ip [3]'。 – Blastfurnace 2012-02-01 20:33:09

回答

1

它可能與來自即使你把事情搞亂後僥倖一點幫助都工作過,我相信。或多或少,一切都是錯誤的。首先你讀到未初始化指針指向的區域(或者你可能讀了指針值,我甚至不知道>> (char*)應該做什麼)。你最好的定義修改爲

std::string inputIP; 

然後嘗試解析它使用scanf,並通過該指針作爲格式字符串。你的意思是使用sscanf。假設你改變了inputIP類型,你可以使用

sscanf(inputIP.c_str(),"%d.... 

然後分配給當地主變x即屏蔽全局,當你在函數中使用它這仍然未初始化。只是刪除int部分在這樣的分配:

x=ip[0]; 

,使ip陣列四個要素。

int ip[4]; 

然後它可能會工作。除非我錯過別的東西。

還有一件事:如果您使用某些源代碼控制(例如使用git,您可能很快就會開始新的項目),那麼當你搞砸時,你會知道你已經改變了什麼,只是提前提交,經常提交。

2

您正在聲明隱藏全局變量'x'。

int x=ip[0];

但是,不要做這種方式。將一個int參數添加到subnetClass中,並以這種方式傳遞該值,並刪除全局變量。

真的,刪除所有的全局變量應該是一個目標,並且很容易完成。幾個僅用於main()。

0

使用sscanf,而不是scanf

相關問題