2010-10-17 37 views
1

J'essaie d'utiliser 'gethostbyname'. Si je code directement un nom d'hôte dans l'appel de fonction, cela fonctionne très bien. Cependant, j'essaye de passer l'entrée d'utilisateur dans cette fonction. Je crois que mon problème peut parce que le tableau que je passe à la fonction a beaucoup d'espaces de fin.Comment faire un tableau qui correspond à la chaîne de stdin?

void connectHost(char *hostname) 
    { 

    int n; 

    //This works 
    //n = gethostbyname("irc.ubuntu.com"); 

    //This always returns NULL 
    n = gethostbyname(hostname); 

    if(n == NULL) 
    { 
    printf("Host Not Found."); 
    } 

    } 

    int main() 
    { 
    char hostname[256]; 
    fgets(hostname,255,stdin); 
    connectHost(hostname); 
    } 

Alors, quelle est la meilleure façon de simplement passer le nom d'hôte à la fonction? Ne devrais-je pas utiliser des fgets?

Merci!

Répondre

2

Lorsque vous entrez irc.ubuntu.com comme entrée, il sera stocké dans hostname comme irc.ubuntu.com\n.
Vous devez retirer la \n à la fin de la chaîne en réécrivant avec le caractère NUL comme:

fgets(hostname,256,stdin);  
hostname[strlen(hostname)-1] = 0; 

Notez que le 2ème argument du fgets est le nombre maximum de caractères à lire (y compris la finale null-caractère), donc dans votre cas, vous le passez 256 pas 255.

0

Chaque fois que vous entrez à l'aide fgets() pensez à exclure le « \ n »:

fgets(hostname,255,stdin); 
hostname[strlen(hostname)-1] = 0; 
+1

Notez que 'fgets' ne contient pas * toujours * un retour chariot (par exemple, si la ligne a été tronquée ou si la dernière ligne d'un fichier ne se termine pas en une). – jamesdlin

+0

@jamesdlin: merci. J'ai fourni une réponse simple qui devrait correspondre à la nécessité d'OP. OP prend une entrée de 'stdin' et a un problème de retour à la ligne. – Donotalo

+0

L'utilisation de 'stdin' rend très probable qu'il y aura un retour à la ligne final, mais il ne le garantit pas (vous pouvez appuyer sur la combinaison de touches EOF du shell). – jamesdlin