2017-03-17 1 views
3

Affiche pour la première fois de Stack Overflow, encourage tous ceux qui peuvent aider.C - Lecture d'une chaîne et d'un int de stdin (ou redirection à partir d'un fichier)

Avoir des problèmes avec mon programme principal, qui devrait "lire depuis stdin (ou rediriger d'un fichier) paires de chaînes et entiers (chaîne suivie par int, une paire par ligne) et insérer ces paires, dans l'ordre lire, dans un arbre de recherche binaire initialement vide. "

Après avoir testé l'insertion de l'arbre de recherche binaire & traverser lui-même en utilisant un cas de test fourni, je connais mon insertion & traversée. Cependant, j'ai du mal à lire dans la chaîne & int ensemble sur la même ligne, et je ne sais pas comment implémenter la redirection de fichiers (puis-je utiliser une commande cat sur le serveur UNIX que je télécharge?).

Voici mon main.c

#include <stdio.h> 
#include "bst.h" 

int main(void) 
{ 
    BStree bst; 
    int size; 
    char quit; 
    char *str; 
    int num; 
    printf("Please enter the size of the tree: "); 
    scanf("%d", &size); 
    bst = bstree_ini(size); 
    printf("Please enter the first key (str) & data (int) you wish to enter, separated by whitespace: "); 
    while ((scanf(" %s %d", str, &num)) == 2) { 
     bstree_insert(bst, *str, num); 
     printf("Please enter Q/q if you wish to stop entering, else continue: "); 
     scanf(" %c", &quit); 
     if(quit == 'Q' || quit == 'q') 
      break; 
     printf("Please enter the new key (str) then the data (int): "); 
     scanf("%s %d", str, &num); 
    } 
    bstree_traversal(bst); 
    bstree_free(bst); 
} 

J'ai essayé d'utiliser une boucle while avec une condition de scanf == 2 pour tester si à la fois la chaîne et entier ont été lus correctement, mais ma mise en œuvre est faux (accidents du programme en atteignant la boucle while).

Suis-je complètement sur la mauvaise voie ici? Ou y a-t-il une erreur logique que je suis complètement absent? Merci encore!

+0

belle après la première fois que je dois dire. –

Répondre

3

Vous devez allouer de la mémoire pour str, essayez char str[256] au lieu de char * str.

Retirez également le scanf du bas de la boucle while, ce n'est pas nécessaire.

+0

Merci beaucoup @cleblanc! J'ai complètement pété le cerveau en ce qui concerne l'allocation de mémoire, et enlevé le scanf en excès. Fonctionne jusqu'ici! – kapkong

0

Votre code a quelques problèmes:

  • En supposant bstree_insert ne reproduit pas la chaîne str, vous devrez allouer vous-même pour chaque itération de boucle ou utiliser le format %ms dans scanf().

  • Vous insérez *str à votre btree, mais *str se réfère uniquement au premier caractère de la chaîne.

  • vous dupliquez l'invite (Please enter the new key...), au lieu de vous inverser la boucle while à une boucle do ... while.

    int main(void) 
    { 
        BStree bst; 
        int size; 
        char quit; 
        char *str; 
        int num; 
        printf("Please enter the size of the tree: "); 
        scanf("%d", &size); 
        bst = bstree_ini(size); 
    
        do { 
        printf("Please enter the new key (str) then the data (int): "); 
        if (scanf("%ms %d", &str, &num) == 2) { 
         bstree_insert(bst, str, num); 
         printf("Please enter Q/q if you wish to stop entering, else continue: "); 
         scanf("%c", &quit); 
         if (quit == 'Q' || quit == 'q') 
          break; 
        } 
        else { 
         printf("Invalid key/data format\n"); 
         break; 
        } 
        } while (1); 
    } 
    
+0

Note: le 'm' dans' "ms" 'ne fait pas partie de la bibliothèque C standard pour' scanf() '. – chux