2017-10-15 109 views
0

我有一个问题。如果我想在字符串中提取多个float号码,我该怎么办? 我知道有像strtof这样的函数可以提取数字。问题是如果有多于字符串中存在一个数字?如何从字符串中提取多个数字C

我只想和我知道只有需要的东西是找到数字后指向下一个字符的指针。然后继续搜索,直到它达到\n但是如何?

例:

想象我有一个关于一些城镇的降雨量报告期间一年,我想每个镇 提取物降雨(当它到达了镇\n报告已完成)。

#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

如果您阅读[manpage for strtod](http://man7.org/man/3/strtod.3.html),您会发现它有两个参数,其中第二个参数用于继续扫描输入。 (我建议''strtod''而不是'strtof',因为除非你有一个好的理由,否则你应该总是使用'double',而不是'float'(如果你必须问什么是一个好理由,你没有一个) – rici

+1

不相关的,但是你的'while'循环中的那个条件并没有达到你想象的那样 –

+0

@JimLewis我只是想知道只有在找到数字后才需要指向下一个字符的指针。然后继续搜索,直到它到达'\ n' –

回答

0

使用两个嵌套for循环,可以捕获每个城镇和月份的浮点值。

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

将城镇名称解析为换行符。如果一个城镇失去了一个月,则以前的代码将使用来自下一个城镇的月份。这将从镇名重复,直到十二个值,一个换行符,一个'\0'或未能解析一个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; 
} 
相关问题