2012-02-01 128 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