解析字符串中的数字

时间:2010-10-04 15:25:03

标签: c++ c stl

说我有这种格式的行

“单词12 YR”或“单词10 MO”

我希望将其转换为

char *分别包含“12Y”或“10M”。

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

由于

6 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是(不使用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];

答案 1 :(得分:1)

对于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;
}

答案 2 :(得分:0)

以空格作为分隔符对其进行标记。连接倒数第二个标记,空格和最后一个标记的第一个字符。

答案 3 :(得分:0)

扫描字符串以查找空格。丢掉前两个字。将第三学期与第四学期的第一个字母结合起来。 strtok或只是一个forloop和一些计数将照顾这一点。

答案 4 :(得分:0)

您可以使用PCRE库并使用正则表达式执行此操作。

答案 5 :(得分:0)

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