此代码是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秒)
答案 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