0

このコードはC/C ++であり、警告やデバッグメッセージなしで実行されます。GNUGCCコンパイラで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秒)

4

3 に答える 3

2

グローバル変数を非表示にしている変数「x」を宣言しています。

int x=ip[0];

ただし、このようにしないでください。intパラメーターをsubnetClassに追加し、その方法で値を渡し、グローバル変数を削除します。

実際、すべてのグローバルを削除することが目標であり、簡単に達成できるはずです。いくつかはmain()でのみ使用されます。

于 2012-02-01T20:25:42.577 に答える
1

後で物事を台無しにしたとしても、運が良ければ少しはうまくいったかもしれないと私は信じています。多かれ少なかれすべてが間違っています。最初に、初期化されていないポインタが指す領域に行を読み取ります(または、ポインタ値を読み取ると、何>> (char*)をすべきかさえわかりません)。定義を次のように変更することをお勧めします

std::string inputIP;

scanf次に、使用されているものを解析し、このポインタをフォーマット文字列として渡そうとします。あなたが意味したのは、を使用することですsscanfinputIPタイプを変更した場合は、

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

x次に、グローバルをシャドウイングするローカルメイン変数に割り当てます。これは、関数で使用するときに初期化されないままになります。int次のように、割り当ての一部を削除するだけです。

x=ip[0];

ip4つの要素の配列を作成します。

int ip[4];

その後、それは動作する可能性があります。私が何か他のものを逃さない限り。

そしてもう1つ:ソース管理を使用する場合(たとえば、使用gitするとすぐに新しいプロジェクトを開始できる場合)、混乱したときに何が変更されたかがわかります。早めにコミットし、頻繁にコミットします。

于 2012-02-01T20:31:23.147 に答える
0

sscanfの代わりに使用scanf

于 2012-02-01T20:25:50.603 に答える