代码之家  ›  专栏  ›  技术社区  ›  vehomzzz

从字符串中分析数字

  •  -1
  • vehomzzz  · 技术社区  · 15 年前

    假设我有这种格式的行

    “单词12 yr”或“单词10 mo”

    我想把它转换成

    分别包含“12Y”或“10M”的字符*。

    格式是两个单词,后跟数字,后跟表示年份或月份的单词。单词用空格/制表符分隔。目前,我正在玩strtok函数

    谢谢

    6 回复  |  直到 15 年前
        1
  •  1
  •   Naveen    15 年前

    一种方法是(无错误检查,使用 boost ):

      string s = "word word 10 MR";
      string res;
      tokenizer<> tok(s);
      tokenizer<>::iterator iter = tok.begin();
      while(iter != tok.end())
      {
          try
          {
            int n = lexical_cast<int>(*iter);
          }
          catch(bad_lexical_cast& e)
          {
              ++iter;
              continue;
          }
    
          break;
      }
    
      res = *iter;
      ++iter;
      res = res + (*iter)[0];
    

    非增强解决方案:

      using namespace std;
      string s = "word word 10 MR";
      string res;
    
      stringstream ss(s);
      istream_iterator<string> iter(ss);
      istream_iterator<string> end;
    
      while(iter != end)
      {
          istringstream iss(*iter);
          int n;
          iss>>n;
    
          if( ! iss.fail())
          {
              break;
          }
          ++iter;
      }
    
      res = *iter;
      ++iter;
      res = res + (*iter)[0];
    
        2
  •  1
  •   user411313    15 年前

    对于ANSI C 89,请看一下:

    char *str="word word 12 YR", *p=str, tmp[MAXSTR], yourstr[MAXYOURSTR]={};
    ...
    while( 1==sscanf(p,"%s",tmp) ) {
      if( *yourstr )
      {
        yourstr[strlen(yourstr)]=*tmp;
        break;
      }
      else
      if( 1==sscanf(tmp,"%[0-9]*") )
        strcpy(yourstr,tmp);
      p+=strlen(tmp)+1;
    }
    
        3
  •  0
  •   Dave Costa    15 年前

    用空格作为分隔符标记它。连接第二个到最后一个令牌、一个空格和最后一个令牌的第一个字符。

        4
  •  0
  •   Michael Dorgan    15 年前

    扫描字符串中的空格。扔掉前两个词。将第三个术语与第四个术语的第一个字母组合在一起。斯特托克或只是一个前环和一些计数会处理这个。

        5
  •  0
  •   Paul Rubel    15 年前

    你可以用 PCRE 用一个regexp来实现。

        6
  •  0
  •   Community Mohan Dere    9 年前

    user411313's answer 让我想到:

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
      char result[9];
      char w[4][1000]; /* temporary */
      const char *src = "word word 12 YR"; /* "word word 10 MO"; */
    
      if (sscanf(src, "%s%s%s%s", w[0], w[1], w[2], w[3]) == 4) {
        size_t len;
        strcpy(result, w[2]);
        result[len = strlen(result)] = *(w[3]);
        result[len + 1] = 0;
      }
      printf("result: [%s]\n", result);
      return 0;
    }