C++,从字符串中提取数据

问题遇到的现象和发生背景

我是自学的C++,最近在做一个小游戏,总体上已经成型了,但是在这里卡了很久了,一直没办法解决
怎样从一个char数组中将想要的数据分别提取出来呢??

问题相关代码,请勿粘贴截图

格式如下:
146345697849*34784$
*号用于分割数据,$号用于标记这组数据的结尾

运行结果及报错内容

由于自身技术的不足,之前尝试的算法不是CPU占用过高就是读取不了

我的解答思路和尝试过的方法

我尝试了好几种方法了,但是数据处理我一直不太熟练,希望有哪位厉害的朋友帮忙解决一下>︿<

我想要达到的结果

将每个数据抽离出来,最好能做到无论有多少个数,都能一个一个抽出来,变成int类型

流操作即可。


#include <iostream>
#include <sstream>

auto main() -> int
{
    char arr[] = "146345697849*34784$";
    std::istringstream is;
    int64_t a = 0;
    char b = 0;
    is.str(arr);
    while (is >> a >> b)
    {
        std::cout << a << '\n' << b << std::endl;
    }
    return 0;
}

我们可以把不是数字的字符看成非法字符(类似换行之类的),
所以这样可以用类似快速读入的方法解决。
参考代码:

#include<bits/stdc++.h>
using namespace std;
inline int Read()//快速读入模板
{
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='$')return -1000000000;//结束读入
        if(ch=='-')f=-1;//负数
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
inline int solve(char str[],int &len)//处理字符串
{
    if(str[len]=='$')return -1000000000;//结束读入
    int s=0,f=1;
    len++;
    while(str[len]<'0'||str[len]>'9')//非法字符
    {
        if(str[len]=='$')return -1000000000;//结束读入
        if(str[len]=='-')f=-1;//负数
        len++;//跳过非法字符
    }
    while(str[len]>='0'&&str[len]<='9')//字符合法
    {
        s=s*10+str[len]-'0';//转int
        len++;//下一个字符
    }
    return s*f;//返回int类型的数字
}
int main()
{
    char buf[20]={"146345699*34784$"};//待处理的字符串
    int now=-1,tot=0,num[20];//now从-1开始,因为函数内部会先加一
    do
    {
        num[++tot]=solve(buf,now);
    }
    while(num[tot]!=-1000000000);//没有遇到非法字符
    tot--;
    for(int i=1;i<=tot;i++)printf("%d\n",num[i]);
    return 0;
}

输出结果:

146345699
34784
  • 由于你给的例子大于了int,所以我把第一个数缩短存在buf数组里了。

效率不知道行不行,但是对于标准的数据是可以进行提取

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    char arr[] = "146345697849*34784$";//待处理数据
    vector<long long int> nums;//存放提取的数据
    int len = sizeof(arr);//如果使用string可以省略这步
    long long int t = 0;//临时存放提取的数字
    for(int i = 0;i < len;i++)
    {
        if(arr[i] >= '0' && arr[i] <= '9')
        {
            t = t * 10 + arr[i] - '0';
        }
        else//提取完一个数字,将其存放
        {
            nums.push_back(t);
            t = 0;//重置临时变量
        }
    }
    return 0;
}


可以看下cpp参考手册中的 c++-字符串

如果还有别的更简洁的方法请各位分享一下,万分感谢!!

char arr[]="146345697849*34784$";
char s1[81],s2[81]
if (2==sscanf(arr,"%80[^*]*80[^$]$",s1,s2)) {
 printf("s1:[%s],s2:[%s]\n",s1,s2);
} else {
 printf("Format error:%s\n",arr);
}