Почему это приложение класса подсети зависает? - PullRequest
0 голосов
/ 02 февраля 2012

Этот код является C / C ++ и выполняется без предупреждений и сообщений отладки.Я использую Code :: blocks с компилятором GNU GCC.Это приложение работало идеально один раз, а затем где-то вдоль линий, которые я запутал, не замечая.Теперь каждый раз он будет разрешать ввод 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 \ Debug \ IP subnetting app.exe

Выполнение: "C: ... \ CodeBlocks / cb_console_runner.exe" "C: ... \ Приложение подсетей IP \ bin \ Debug \ IP subnetting app.exe" (в C: ... \ Приложение подсетей IP.)

Процесс завершен со статусом -1073741510 (0 минут, 27 секунд)

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Вы объявляете переменную 'x', которая скрывает глобальную.

int x=ip[0];

Однако не делай так. Добавьте параметр int в subnetClass, передайте значение таким образом и удалите глобальную переменную.

Действительно, удаление всех ваших глобалов должно быть целью, которую легко достичь. Некоторые из них используются только в main ().

1 голос
/ 02 февраля 2012

Это могло бы сработать с небольшой помощью от чистой удачи, даже если бы вы все испортили позже, я полагаю. Более или менее все не так. Сначала вы читаете строку в область, на которую указывает неинициализированный указатель (или, может быть, вы читаете значение указателя, я даже не уверен, что должен делать >> (char*)). Вам лучше изменить определение на

std::string inputIP;

затем вы пытаетесь проанализировать его, используя scanf, и передаете этот указатель как строку формата. То, что вы имели в виду, использует sscanf. Предполагая, что вы изменили тип inputIP, вы можете использовать

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

Затем вы присваиваете локальной главной переменной x, которая скрывает глобальную переменную, которая остается неинициализированной, когда вы используете ее в функции. Просто удалите часть int в назначении следующим образом:

x=ip[0];

и создайте массив ip из четырех элементов.

int ip[4];

Тогда это может сработать. Если только я не пропустил что-то еще.

И еще одна вещь: если вы используете какой-либо элемент управления исходным кодом (например, с помощью git, вы можете начать новый проект в кратчайшие сроки), то вы будете знать, что вы изменили, когда запутались, просто зафиксируйте заранее, закоммите часто.

0 голосов
/ 02 февраля 2012

Используйте sscanf вместо scanf

...