为什么这个子网类应用程序会冻结?

时间:2012-02-01 20:22:53

标签: c++ ip subnet

此代码是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子网app \ bin \ Debug \ IP子网app.exe

     

执行:“C:... \ CodeBlocks / cb_console_runner.exe”“C:... \ IP子网划分app \ bin \ Debug \ IP子网app.exe”(在C:... \ IP子网划分应用程序中。)

     

处理终止,状态为-1073741510(0分27秒)

3 个答案:

答案 0 :(得分:2)

您正在声明隐藏全局变量'x'的变量。

int x=ip[0];

但是,不要这样做。将一个int参数添加到subnetClass并传入该方式的值,并删除全局变量。

真的,删除所有的全局变量应该是一个目标,并且很容易实现。有几个仅用于main()。

答案 1 :(得分:1)

我相信,即使你后来搞砸了事情,它也可能在运气方面有所帮助。或多或少都是错的。首先,你将行读入未初始化指针指向的区域(或者你可能读取指针值,我甚至不确定>> (char*)应该做什么)。您最好将定义更改为

std::string inputIP;

然后您尝试使用scanf解析它并将此指针作为格式字符串传递。你的意思是使用sscanf。假设您更改了inputIP类型,则可以使用

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

然后你分配给阴影全局的局部主变量x,当你在函数中使用它时它仍未被初始化。只需删除作业中的int部分,如下所示:

x=ip[0];

并制作包含四个元素的ip数组。

int ip[4];

然后它可能会起作用。除非我错过了别的东西。

还有一件事:如果您使用某些源代码控制(例如使用git,您可以立即启动新项目)然后您就会知道当您陷入困境时您已经改变了什么,只是提前提交,经常提交。

答案 2 :(得分:0)

使用sscanf代替scanf