2017-10-15 3 views
0

J'ai une question. Si je veux extraire plus d'un float nombre dans un chaîne que dois-je faire? Je sais qu'il existe des fonctions comme strtof par lesquelles je peux extraire le nombre. La question est de savoir s'il y a plus de un numéro existant dans la chaîne? Je veux juste et je sais que la seule chose qui est nécessaire est le pointeur vers le caractère suivant après avoir trouvé le nombre. Puis continuez à chercher jusqu'à atteindre \n mais comment?Comment extraire plusieurs nombres d'une chaîne en C

Exemple:

Imaginez que j'ai un rapport sur les précipitations de certaines villes au cours d'une année et je veux pluie d'extrait pour chaque ville (quand il fait le rapport \n pour la ville est terminé).

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

int main(int argc, char **argv) 
{ 
    char* data = "Rome:Jan 81.2,Feb 63.2,Mar 70.3,Apr 55.7,May 53.0,Jun 36.4,Jul 17.5,Aug 27.5,Sep 60.9,Oct 117.7,Nov 111.0,Dec 97.9\n" 
    "London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9\n" 
    "Paris:Jan 182.3,Feb 120.6,Mar 158.1,Apr 204.9,May 323.1,Jun 300.5,Jul 236.8,Aug 192.9,Sep 66.3,Oct 63.3,Nov 83.2,Dec 154.7\n" 
    "NY:Jan 108.7,Feb 101.8,Mar 131.9,Apr 93.5,May 98.8,Jun 93.6,Jul 102.2,Aug 131.8,Sep 92.0,Oct 82.3,Nov 107.8,Dec 94.2\n" 
    "Vancouver:Jan 145.7,Feb 121.4,Mar 102.3,Apr 69.2,May 55.8,Jun 47.1,Jul 31.3,Aug 37.0,Sep 59.6,Oct 116.3,Nov 154.6,Dec 171.5\n" 
    "Sydney:Jan 103.4,Feb 111.0,Mar 131.3,Apr 129.7,May 123.0,Jun 129.2,Jul 102.8,Aug 80.3,Sep 69.3,Oct 82.6,Nov 81.4,Dec 78.2\n" 
    "Bangkok:Jan 10.6,Feb 28.2,Mar 30.7,Apr 71.8,May 189.4,Jun 151.7,Jul 158.2,Aug 187.0,Sep 319.9,Oct 230.8,Nov 57.3,Dec 9.4\n" 
    "Tokyo:Jan 49.9,Feb 71.5,Mar 106.4,Apr 129.2,May 144.0,Jun 176.0,Jul 135.6,Aug 148.5,Sep 216.4,Oct 194.1,Nov 95.6,Dec 54.4\n" 
    "Beijing:Jan 3.9,Feb 4.7,Mar 8.2,Apr 18.4,May 33.0,Jun 78.1,Jul 224.3,Aug 170.0,Sep 58.4,Oct 18.0,Nov 9.3,Dec 2.7\n" 
    "Lima:Jan 1.2,Feb 0.9,Mar 0.7,Apr 0.4,May 0.6,Jun 1.8,Jul 4.4,Aug 3.1,Sep 3.3,Oct 1.7,Nov 0.5,Dec 0.7"; 
    const char* towns[14] = {"Rome", "London", "Paris", "NY", "Vancouver", "Sydney", "Bangkok", "Tokyo", 
          "Beijing", "Lima", "Montevideo", "Caracas", "Madrid", "Berlin"}; 
    size_t i = 0; 
    float nums[12]; 
    char *ch_ptr = strstr(data,towns[0]); //pointing to first character 
    const char *stop ="\n"; 
    while((ch_ptr++) != stop) 
     { 
      nums[i] = strtof(); ///How should I do it ???? 
      i++; 
      } 
    return 0; 
} 
+0

Si vous lisez la [page de manuel pour strtod] (http://man7.org/man/3/strtod.3.html), vous verrez qu'il prend deux arguments, dont le second peut être utilisé pour continuer à numériser l'entrée. (Je suggère "strtod" plutôt que "strtof" parce que vous devriez toujours utiliser "double", pas "float" sauf si vous avez un giid rwason de ne pas le faire (et si vous devez demander ce qui est une bonne raison, vous n'avez pas un) – rici

+1

Non lié, mais cette condition dans votre boucle 'while' ne fait pas ce que vous pensez qu'il fait –

+0

@JimLewis Je veux juste et je sais que la seule chose qui est nécessaire est un pointeur vers le caractère suivant après avoir trouvé le numéro Puis continuez à chercher jusqu'à ce qu'il atteigne '\ n' –

Répondre

0

En utilisant deux for boucles imbriquées, la valeur flottante pour chaque ville et mois peut être capturé.

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

int main(int argc, char **argv) 
{ 


    char* data = "Rome:Jan 81.2,Feb 63.2,Mar 70.3,Apr 55.7,May 53.0,Jun 36.4,Jul 17.5,Aug 27.5,Sep 60.9,Oct 117.7,Nov 111.0,Dec 97.9\n" 
    "London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9\n" 
    "Paris:Jan 182.3,Feb 120.6,Mar 158.1,Apr 204.9,May 323.1,Jun 300.5,Jul 236.8,Aug 192.9,Sep 66.3,Oct 63.3,Nov 83.2,Dec 154.7\n" 
    "NY:Jan 108.7,Feb 101.8,Mar 131.9,Apr 93.5,May 98.8,Jun 93.6,Jul 102.2,Aug 131.8,Sep 92.0,Oct 82.3,Nov 107.8,Dec 94.2\n" 
    "Vancouver:Jan 145.7,Feb 121.4,Mar 102.3,Apr 69.2,May 55.8,Jun 47.1,Jul 31.3,Aug 37.0,Sep 59.6,Oct 116.3,Nov 154.6,Dec 171.5\n" 
    "Sydney:Jan 103.4,Feb 111.0,Mar 131.3,Apr 129.7,May 123.0,Jun 129.2,Jul 102.8,Aug 80.3,Sep 69.3,Oct 82.6,Nov 81.4,Dec 78.2\n" 
    "Bangkok:Jan 10.6,Feb 28.2,Mar 30.7,Apr 71.8,May 189.4,Jun 151.7,Jul 158.2,Aug 187.0,Sep 319.9,Oct 230.8,Nov 57.3,Dec 9.4\n" 
    "Tokyo:Jan 49.9,Feb 71.5,Mar 106.4,Apr 129.2,May 144.0,Jun 176.0,Jul 135.6,Aug 148.5,Sep 216.4,Oct 194.1,Nov 95.6,Dec 54.4\n" 
    "Beijing:Jan 3.9,Feb 4.7,Mar 8.2,Apr 18.4,May 33.0,Jun 78.1,Jul 224.3,Aug 170.0,Sep 58.4,Oct 18.0,Nov 9.3,Dec 2.7\n" 
    "Lima:Jan 1.2,Feb 0.9,Mar 0.7,Apr 0.4,May 0.6,Jun 1.8,Jul 4.4,Aug 3.1,Sep 3.3,Oct 1.7,Nov 0.5,Dec 0.7"; 
    const char* months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun" 
    , "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; 
    const char* towns[14] = {"Rome", "London", "Paris", "NY", "Vancouver", "Sydney", "Bangkok", "Tokyo", 
    "Beijing", "Lima", "Montevideo", "Caracas", "Madrid", "Berlin"}; 
    size_t i = 0; 
    float nums[12]; 
    char *end = NULL; 
    char *town_ptr = NULL; 
    char *month_ptr = NULL; 
    char monthid[100] = ""; 
    char townid[100] = ""; 
    for (int town = 0; town < 14; town++) 
    { 
     if ((town_ptr = strstr (data, towns[town]))) { 
      i = 0; 
      sscanf (town_ptr, "%99[^:]", townid); 
      for (int month = 0; month < 12; month++) 
      { 
       if ((month_ptr = strstr (town_ptr, months[month]))) { 
        sscanf (month_ptr, "%99s", monthid); 
        month_ptr += strlen (months[month]); 
        nums[i] = strtof(month_ptr, &end); 
        if (*end == ',' || *end == '\n' || *end == '\0') { 
         printf ("%s %s nums[%d] = %f\n", townid, monthid, i, nums[i]); 
         i++; 
        } 
       } 
      } 
     } 
    } 
    return 0; 
} 

Pour analyser le nom de la ville en nouvelle ligne. Si un mois manquait dans une ville, le code précédent utilisait le mois de la ville suivante. Cela va itérer du nom de la ville jusqu'à douze valeurs, une nouvelle ligne, un '\0' ou l'échec d'analyser un double.

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

int main(int argc, char **argv) 
{ 


    char* data = "Rome:Jan 81.2,Feb 63.2,Mar 70.3,Apr 55.7,May 53.0,Jun 36.4,Jul 17.5,Aug 27.5,Sep 60.9,Oct 117.7,Nov 111.0,Dec 97.9\n" 
    "London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9\n" 
    "Paris:Jan 182.3,Feb 120.6,Mar 158.1,Apr 204.9,May 323.1,Jun 300.5,Jul 236.8,Aug 192.9,Sep 66.3,Oct 63.3,Nov 83.2,Dec 154.7\n" 
    "NY:Jan 108.7,Feb 101.8,Mar 131.9,Apr 93.5,May 98.8,Jun 93.6,Jul 102.2,Aug 131.8,Sep 92.0,Oct 82.3,Nov 107.8,Dec 94.2\n" 
    "Vancouver:Jan 145.7,Feb 121.4,Mar 102.3,Apr 69.2,May 55.8,Jun 47.1,Jul 31.3,Aug 37.0,Sep 59.6,Oct 116.3,Nov 154.6,Dec 171.5\n" 
    "Sydney:Jan 103.4,Feb 111.0,Mar 131.3,Apr 129.7,May 123.0,Jun 129.2,Jul 102.8,Aug 80.3,Sep 69.3,Oct 82.6,Nov 81.4,Dec 78.2\n" 
    "Bangkok:Jan 10.6,Feb 28.2,Mar 30.7,Apr 71.8,May 189.4,Jun 151.7,Jul 158.2,Aug 187.0,Sep 319.9,Oct 230.8,Nov 57.3,Dec 9.4\n" 
    "Tokyo:Jan 49.9,Feb 71.5,Mar 106.4,Apr 129.2,May 144.0,Jun 176.0,Jul 135.6,Aug 148.5,Sep 216.4,Oct 194.1,Nov 95.6,Dec 54.4\n" 
    "Beijing:Jan 3.9,Feb 4.7,Mar 8.2,Apr 18.4,May 33.0,Jun 78.1,Jul 224.3,Aug 170.0,Sep 58.4,Oct 18.0,Nov 9.3,Dec 2.7\n" 
    "Lima:Jan 1.2,Feb 0.9,Mar 0.7,Apr 0.4,May 0.6,Jun 1.8,Jul 4.4,Aug 3.1,Sep 3.3,Oct 1.7,Nov 0.5,Dec 0.7"; 
    const char* towns[14] = {"Rome", "London", "Paris", "NY", "Vancouver", "Sydney", "Bangkok", "Tokyo", 
    "Beijing", "Lima", "Montevideo", "Caracas", "Madrid", "Berlin"}; 
    float nums[12]; 
    char *end = NULL; 
    char *town_ptr = NULL; 
    char monthid[100] = ""; 
    char townid[100] = ""; 
    int span = 0; 
    for (int town = 0; town < 14; town++) 
    { 
     if ((town_ptr = strstr (data, towns[town]))) {//find the town name 
      sscanf (town_ptr, "%99[^:]:%n", townid, &span); 
      int each = 0; 
      town_ptr += span; 
      do { 
       sscanf (town_ptr, "%s%n", monthid, &span); 
       town_ptr += span; 
       nums[each] = strtod (town_ptr, &end); 
       if (end == town_ptr) {//failed to parse a double 
        break; 
       } 
       printf ("%s %s nums[%d] = %f\n", townid, monthid, each, nums[each]); 
       town_ptr = end + 1;//to advance past the comma 
       each++; 
      } while (each < 12 && *end != '\0' && *end != '\n'); 
     } 
    } 
    return 0; 
}