разобрать номер из строки - PullRequest
0 голосов
/ 04 октября 2010

Скажем, у меня есть строка в этом формате

"слово слово 12 YR" или "слово слово 10 МО"

, и я хочу преобразовать его в

char* содержит «12Y» или «10M» соответственно.

Формат состоит из двух слов, после которых следует число, за которым следует слово, обозначающее год или месяц.слова разделены пробелом / табуляцией.В настоящее время я играю с функцией strtok

Спасибо

Ответы [ 6 ]

1 голос
/ 04 октября 2010

для 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;
}
1 голос
/ 04 октября 2010

Один из способов сделать это (без проверки ошибок, используя 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];

Non-boost решение:

  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];
0 голосов
/ 05 октября 2010

пользователь user411313 заставил меня задуматься об этом:

#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;
}
0 голосов
/ 04 октября 2010

Вы можете использовать библиотеку PCRE и сделать это с помощью регулярного выражения.

0 голосов
/ 04 октября 2010

Сканирование вашей строки на наличие пробелов.Выбросьте первые 2 слова.Объедините 3-й член с первой буквой 4-го члена.strtok или просто forloop и некоторые подсчеты позаботятся об этом

0 голосов
/ 04 октября 2010

Токенизируйте его с пробелом в качестве разделителя. Объедините второй-последний токен, пробел и первый символ последнего токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...