1

DNSサーバーの動作をシミュレートしようとしています。DNSサーバーには、次のような名前のDBがありhosts.txtますmachine_names/IP_addresses

equipo_00/169.0.1.169
sala_oeste_01/200.1.2.200
sala_oeste_02/200.2.3.200
sala_oeste_03/200.3.4.200
MEMFIS_04/201.4.5.201
ICARO_05/200.5.6.200
equipo_06/169.6.7.169
sala_este_07/201.7.8.201
sala_este_08/201.8.9.201
CEC_09/189.9.10.189

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    char* machine, *ip_add;
    FILE* db;
    char* flag;
    char  tmp[256];
    char  par[256];
    printf("> ");
    scanf("%s", par);
    db = fopen("hosts.txt", "r");
    while(db != NULL && fgets(tmp, sizeof(tmp), db) != NULL)
    {
        if(strstr(tmp, par))
        {
            flag = "1"; // flag setting to 1 means find the line
            machine = strtok(tmp, "/");//here's supposed to get the value of the machine
            ip_add = strtok(NULL, "/");//here's supposed to get the value of the ip adress
        }
    }//while

    if(strcmp(flag, "1") == 0) //
    {
        printf("here\n");
    }
    else
    {
        flag = "0"; //flag setting to 0
        printf("there\n");
    }

    printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);
    return 0;
}

私のコードは、マシンの値である標準入力から読み取り、サーバー上のそのマシンに割り当てられているIPアドレスを示します。問題は、プログラムが正常な動作ではないことです。コードを期待される出力に変更する方法がわかりません。

input: equipo_00
output: flag = 1 pc = equipo_00 server=169.0.1.169

質問がかなりばかげている場合は申し訳ありませんが、私はこの言語に不慣れです..あなたの助けに感謝し、私の英語を許します

4

4 に答える 4

4

これはあなたがすることです:

ファイルから文字列を に読み込みますtmp

ユーザーが入力した文字列parが に存在するかどうかを確認しtmpます。

はいの場合は、先に進んでトークン化tmp/、ポインターmachineを最初のピースにip_addポイントさせ、次のピースにポイントさせます。

machineip_add単なるポインタであることに注意してください。そして、それらは のさまざまなインデックスを指していますtmp。そのため、後でループを続行するときに、新しい文字列を再度 に tmp読み込み、上書きします。これにより問題が発生し、ポインタは変更された文字列を指しています。

これを避けるには、一致が成功した後にブレークを追加します。

if (strstr(tmp, par)) {
   flag = "1";
   machine = strtok(tmp, "/");
   ip_add = strtok(NULL, "/");
   break;       
}

また、あなたの最終printf

printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);

if一致するものが見つかった場合にのみ印刷できるように、体の一部にする必要があります。現在、一致するものが見つからなくても印刷しています。その場合、ポインタとしてジャンクを出力し、初期化されserverip_addいません。

于 2010-12-03T07:44:08.380 に答える
0

以下は修正されたコードです。いくつかのマイナーなエラーがあり、ほとんどの場合、initが欠落しています。マシンが見つからない場合はどうなるか考えてみてください。

主なものは、ループの反復ごとに同じバッファーを使用することです。これにより、以前に検出されたサーバーがクリアされます。ループを終了して修正しました。別の方法は、見つかった結果を別のバッファーにコピーすることです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    char* machine = "";
    char* ip_add = "";
    FILE* db;
    char* flag;
    char  tmp[256];
    char  par[256];
    printf("> ");
    scanf("%s", par);
    db = fopen("hosts.txt", "r");
    while(db != NULL && fgets(tmp, sizeof(tmp), db) != NULL)
    {
        char * found = strstr(tmp, par);
        if(found)
        {
            flag = "1"; // flag setting to 1 means find the line
            machine = strtok(found, "/");//here's supposed to get the value of the machine
            ip_add = strtok(NULL, "/");//here's supposed to get the value of the ip adress
            break;
        }
    }//while

    if(strcmp(flag, "1") == 0)
    {
        flag = "0"; //flag setting to 0
    }

    printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);
    return 0;
}
于 2010-12-03T08:02:17.550 に答える
0

あなたの問題はflag変数にあるようです。フラグ値に文字列を使用するのは非常に珍しいようです。これを試して:

int flag = 0; // always initialise your variables

if (strstr(tmp, par) == 0) {
    flag = 1; // just an integer value
}

if (flag) { // easier to test the value too!
    // ...
}

printf("flag=%d\n", flag); // ints use %d format value

上記のコードflagでは、関数の開始時に変数が初期化されていないため、予期しない (および未定義の) 結果が生じる可能性があります。

于 2010-12-03T07:35:06.327 に答える
0
if(strcmp(flag, "1") == 0)

フラグが初期化されていない場合は未定義の動作であるため、これを確認することはできません

strcmp() は両方の引数で '\0' 文字を検索します

于 2010-12-03T09:14:56.483 に答える