2010-12-03 27 views
1

Je suis en train de simuler le comportement d'un serveur DNS, que j'ai un DB nommé hosts.txt contenant machine_names/IP_addresses, par exemple:Comportement anormal pour gérer les fichiers texte dans C

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 

Voici mon code:

#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; 
} 

Mon code lit à partir de l'entrée standard la valeur de la machine et indique l'adresse IP attribuée à cette machine sur le serveur. Le problème est que le programme n'est pas un comportement normal, je ne sais pas comment modifier mon code à une sortie attendue, par exemple

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

Désolé si la question est assez stupide, je suis nouveau dans cette langue .. merci à tous pour votre aide et excusez mon anglais

+1

Quel est le problème maintenant/quel est le problème que vous voyez avec votre code? –

Répondre

4

Voici ce que vous faites:

Lire une chaîne à partir du fichier dans tmp.

Vérifiez si l'utilisateur a saisi la chaîne par dans tmp.

Si oui, vous allez de l'avant et tokenize tmp sur / et faire le pointeur machine points à la première pièce et ip_add point à l'autre pièce.

Notez que machine et ip_add sont juste des pointeurs. Et ils pointent à divers indices de tmp. Plus tard, lorsque vous continuez avec la boucle, vous lisez à nouveau la nouvelle chaîne entmp, en l'écrasant. Cela provoque le problème et votre pointeur pointe maintenant vers une chaîne modifiée.

Pour éviter cela il suffit d'ajouter une pause après un match réussi:

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

également votre dernière printf:

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

devrait faire partie de votre corps if, afin que vous les imprimer seulement si vous avez trouvé le match. Actuellement, vous imprimez même si aucune correspondance n'est trouvée. Dans ce cas, vous imprimerez des fichiers inutiles car vos pointeurs server et ip_add n'ont pas été initialisés .

+1

+1 pour recommander 'break' plutôt que' strdup' comme beaucoup de gens le feraient. –

0

Il semble que votre problème pourrait être avec la variable flag. Utiliser une chaîne pour une valeur de drapeau semble très inhabituel. Essayez ceci:

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 

Dans votre code ci-dessus, la variable flag est uninitialised au début de la fonction qui ne peut donner des résultats inattendus (et non définis).

0

Ci-dessous le code fixe. Il y a plusieurs erreurs mineures, la plupart manquant inits. Pensez à ce qui se passerait si la machine n'était pas trouvée.

La principale est que vous utilisez le même tampon pour chaque itération de la boucle, ce qui efface le serveur précédemment trouvé. J'ai réparé cela en sortant de la boucle. Une autre méthode pourrait consister à copier le résultat trouvé dans un autre tampon.

#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; 
} 
0
if(strcmp(flag, "1") == 0) 

vous ne pouvez pas vérifier parce que si le drapeau n'a pas été initializied c'est un comportement non défini

strcmp() SEARCHs pour le caractère '\ 0' dans les deux arguments