Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符串中解析数字_C++_C_Stl - Fatal编程技术网

C++ 从字符串中解析数字

C++ 从字符串中解析数字,c++,c,stl,C++,C,Stl,假设我有这个格式的行 “单词12年”或“单词10个月” 我想把它转换成 分别包含“12Y”或“10M”的字符* 格式为两个单词,后跟数字,后跟表示年份或月份的单词。单词以空格/制表符分隔。目前,我正在使用strtok函数 谢谢用空格作为分隔符标记它。连接倒数第二个标记、空格和最后一个标记的第一个字符。扫描字符串以查找空格。扔掉前两个单词。将第三学期与第四学期的第一个字母组合。strtok或只是一个forloop和一些计数就可以解决这个问题。您可以使用该库并使用regexp进行操作。一种方法是(无

假设我有这个格式的行

“单词12年”或“单词10个月”

我想把它转换成

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

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


谢谢

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

扫描字符串以查找空格。扔掉前两个单词。将第三学期与第四学期的第一个字母组合。strtok或只是一个forloop和一些计数就可以解决这个问题。

您可以使用该库并使用regexp进行操作。

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

string s=“word 10 MR”;
字符串res;
标记器tok(s);
标记器::迭代器iter=tok.begin();
while(iter!=tok.end())
{
尝试
{
int n=词汇投射(*iter);
}
捕获(错误的\u词法\u铸造和e)
{
++iter;
继续;
}
打破
}
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];
使用名称空间std;
string s=“word 10 MR”;
字符串res;
溪流ss(s);;
istream_迭代器iter(ss);
istream_迭代器端;
while(iter!=结束)
{
istringstream iss(*iter);
int n;
iss>>n;
如果(!iss.fail())
{
打破
}
++iter;
}
res=*iter;
++iter;
res=res+(*iter)[0];

对于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;
}
让我想到:

#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;
}
#包括
#包括
内部主(空){
字符结果[9];
字符w[4][1000];/*临时*/
const char*src=“word 12年”/*“word 10个月”*/
如果(sscanf(src,“%s%s%s%s”,w[0],w[1],w[2],w[3])==4){
尺寸透镜;
strcpy(结果,w[2]);
结果[len=strlen(结果)]=*(w[3]);
结果[len+1]=0;
}
printf(“结果:[%s]\n”,结果);
返回0;
}

您应该更清楚地了解需要处理的字符串的种类,以及它们是否都是格式正确的,如果它们的格式不正确,您希望发生什么。你的标签看起来也不对。C没有“STL”和“CPP”,意思是C预处理器,不是C++。很不清楚你在这里问什么,或者你已经在哪里。抱歉,我澄清了C++中的描述格式,他也可以使用Booo::ReEX,它有被包含在C++标准的下一个版本中的优势。有些人在遇到问题时会思考。“我知道,我会使用正则表达式。”现在他们有两个问题。()我不能使用这种库,也不能使用boost。让我们使用标准中可用的
#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;
}