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