2009-10-30 7 views
0

J'ai besoin de coder une fonction qui va prendre x nombres. (x est lu dans la fonction comme un argument) Les nombres peuvent être précédés et séparés par un nombre quelconque d'espaces blancs et de nouvelles lignes, et après que le dernier nombre est entré, un caractère de nouvelle ligne termine l'analyse. J'ai pensé à utiliser des chaînes de caractères et à ne tenir compte d'aucun caractère numérique. Quand un caractère numérique est entré, il sera lu dans la chaîne, ainsi que tous les caractères numériques suivants. Quand un espace blanc ou une nouvelle ligne est entré après un nombre, je veux que le nombre dans la chaîne soit entré dans un tableau. Donc si la chaîne contient {'1', '3', '2'}, je veux placer la valeur de "132" dans la cellule dans un tableau.lire en chiffres en utilisant des chaînes

Je vais définir un compteur à compter lorsqu'un nombre est placé dans un tableau, et lorsque la quantité de nombres nécessaire est atteinte, la fonction retournera.

Voici ce que j'ai jusqu'ici:

void read_vector(int* v, int n) 
    { 
     int value, i = 0, j = 0, k; 
     char num, str[9]; 

     do 
     { 
      num = getchar(); 

      if (num > 47 && num < 58) 
      { 
       while (i < 10) 
       {  
        str[i] = num; 
        i++; 
        num = getchar(); 

        if (i = 9 || num < 47 || num > 58) 
        { 
         str[i] = '\0' 
         j++; 

         for(k = 1; k <= strlen(str); k++) 
         { 
          value += str[k - 1] * pow(10, (strlen(str) - k)); 
         } 

         v[j] = value 

         if(j = n) 
          return; 
        } 
       } 
      } 
     } 

     while (1); 
    } 

Merci

+0

Seulement des entiers positifs? –

+0

Pour l'instant, oui. Je ne prendrai que des entiers positifs. Aussi, s'il y a une façon plus simple de le faire, je suis ouvert. – Kyle

+2

Utilisez et isdigit() pour l'amour de la pitié. Vous devriez obtenir un zéro pour l'utilisation de 'num> 47 && num <58'! –

Répondre

2

J'utiliser un membre de la famille scanf en fonction de la façon dont votre entrée est présenté. fscanf() fait à peu près ce que vous demandez.

+0

Après avoir lu un peu à propos de fscanf(), je vois que le premier argument est le flux à partir duquel le texte sera entré. Je ne suis pas familier avec ça. Les nombres seront saisis de plusieurs façons, donc je ne suis pas sûr de pouvoir en spécifier un. Je vois que scanf est le même que fscanf avec stdin comme premier argument. Je m'excuse. Je suis assez nouveau à ce sujet. Pouvez-vous expliquer stdin. Je crois comprendre que scanf continuera à chercher jusqu'à ce qu'une nouvelle ligne soit atteinte. J'aimerais qu'il continue à chercher jusqu'à ce que n nombres aient été tapés. – Kyle

+0

Il y a trois fonctions dans la famille, scanf qui lit à partir de stdin, fscanf qui lit à partir d'un fichier texte et sscanf qui "lit" à partir d'une chaîne. Ils utilisent une chaîne de format pour décrire à quoi l'entrée doit ressembler. Ils ignoreront les espaces arbitraires et assigneront des variables basées sur la chaîne de format.Ce qui n'est pas clair, c'est si cela sera assez flexible pour vous parce que vous dites "Les nombres seront entrés de plusieurs façons" sans détails. Passez du temps avec un bon manuel C tel que "The C Programming Language" de Kernigan et Richie ou faites un tour en ligne. Bonne chance. –

0

Tout d'abord, vous semblez être un peu confus au sujet de l'utilisation des opérateurs de comparaison en C. Consultez comparison and logical operators in C

En ce moment votre ifs ne fera pas ce que vous les attendez à faire

Et ne pas être nitpicky ou quoi que ce soit, mais votre première boucle serait probablement mieux répondre à vos besoins en tant que pour boucle puisque vous avez besoin d'un compteur de toute façon.

+0

ouais, je voulais dire "if (i == 9 || num < 47 || num > 58)" – Kyle

1

Je recommande que vous utilisez strtok() pour diviser la chaîne en jetons, et l'utilisation du atoi(), atol() ou atof() pour convertir le texte en chiffres. Par exemple: (. Je ne ai testé cet exemple, et il ne parvient pas à vérifier l'exactitude)

void 
read_nums(int count, double *buffer, char *str) 
{ 
    int i; 
    char *str2; 

    // Read the first token 
    str2 = strtok(srt, " \n\t\r"); 

    for (i = 0; i < count;) { 
     if (*str2) 
      // Convert and store the number 
      buffer[i++] = atof(str2); 

     // Read the next token 
     str2 = strtok(NULL, " \n\t\r"); 
    } 
} 

Je recommande que vous regardez une bonne documentation sur ces fonctions pour voir exactement comment la mettre en œuvre

Questions connexes