2012-02-01 4 views
0

이 코드는 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 서브넷 \ IP 서브넷 응용 프로그램 \ 빈은

실행

을 App.exe가 "C를 .. . \ IPB 서브넷 응용 프로그램 \ bin \ Debug \ IP 서브넷 지정 app.exe "(C : ... \ IP 서브넷 응용 프로그램)

프로세스가 상태와 함께 종료되었습니다. -1073741510 (0 분 27 초)

+0

들여 쓰기를하십시오. 그리고 당신의 프로그램은 C++ 또는 C입니다; 둘 다 될 수는 없습니다. (C처럼 보이지는 않습니다.) 디버거를 통해 실행 했습니까? _and_ close를 어떻게 멈출 수 있습니까? –

+1

존재하지 않는 C 스타일의 문자열에 문자열을 추출합니다 ('inputIP'는 초기화되지 않은 포인터 임). –

+2

'int ip [3]', 3 개의 int (인덱스 0..2)의 배열을 선언 한 다음 배열 끝을 지나가는'ip [3]'에 씁니다. – Blastfurnace

답변

1

의 그것은 나중에 일을 엉망 경우에도 순전히 행운의 도움과 협력 수도, 저는 믿습니다. 다소간 모든 것이 잘못되었습니다. 먼저 초기화되지 않은 포인터가 가리키는 영역으로 라인을 읽습니다 (또는 포인터 값을 읽었을 때, 나는 >> (char*)이해야 할 일인지 확신 할 수 없습니다). 당신은 더 나은 다음은 scanf을 사용하는 구문 분석 및 형식 문자열로이 포인터를 전달하려고

std::string inputIP; 

에 정의를 변경합니다. 무슨 의미입니까 sscanf을 사용하고 있습니다. 당신이 inputIP 유형을 변경 한 가정하면,

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

그런 다음 당신이 함수를 사용할 때 초기화되지 않은 남아 글로벌 그림자 지역 주요 변수 x,에 할당 할 수 있습니다.

x=ip[0]; 

을 네 요소의 ip 배열을 만들 : 그냥이 같은 과제에 int 부분을 제거합니다.

int ip[4]; 

그러면 작동 할 수 있습니다. 내가 다른 것을 놓친 게 아니라면.

그리고 한 가지 더 : 예를 들어 git을 사용하여 일부 소스 컨트롤을 사용하는 경우 새로운 프로젝트를 즉시 시작할 수 있습니다. 그런 다음 엉망으로 만들었을 때 무엇을 변경했는지 알 수 있습니다. .

2

전역 변수를 숨기는 'x'변수를 선언하고 있습니다. 그러나

int x=ip[0];

는 이런 식으로하지 않습니다. subnetClass에 int 매개 변수를 추가하고 그런 식으로 값을 전달하고 전역 변수를 제거하십시오.

정말, 모든 글로벌을 제거하는 것이 목표이며 달성하기 쉽습니다. 몇몇은 main()에서만 사용됩니다.

0

사용 sscanf 대신 scanf

관련 문제