字符串中如何提取数值

给一段字符串,如何在给定的字符串中提取出相应的数值,并运用这些数值;

可以使用 getchar() 找到特殊字符 , 然后把相应的数值存入一个字符数组中,最后在字符数组的最后一位加上''(字符串结束标志),然后字符数组中的字符转换成数值,可以使用sscanf(s,"%lf",&a) 也可以使用atof(s) ;两种方法效果相同;

具体解法如下:

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std ;

char a[105] , aa ;
char flag ;
void getss(char *s)	{
	int i = 0 ; 
	for(;i < 100 ; i++)	{
		s[i] = getchar() ;
		if(s[i] == '=')	{
			int j = 0 ;
			for(++i ; i < 100 ; i++,j++)	{
				s[i] = getchar() ;
				if((s[i] == 'm' || s[i] == 'M' || s[i] == 'k'))	{
					s[++i] = getchar() ;
					if(s[i] == 'A'||s[i] == 'V'||s[i] == 'W')	{
					flag = s[i-1] ;
					}
				}
				a[j] = s[i] ;
				if(a[j] == '.')
					continue ;
				if(a[j] < '0' || a[j] > '9')	{
					a[j] = '' ;
					aa = s[i] ;
					break ;
				}
			}
			break ;
		}
	}
}

int main()	{
	int n ; 
	cin >> n ; 
	getchar() ;
	int t = 1 ;
	while(n--)	{
		char s1[105] , s2[105]  , s3[105] ;
		double x , y ;
		flag = 'e';
		getss(s1) ;
		char a1[105] , a2 = aa ;
		strcpy(a1,a);
		x = atof(a1) ;
		if(flag == 'm')
			x /= 1000 ;
		else if(flag == 'k')
			x *= 1000 ;
		else if(flag == 'M')
			x *= 1000000 ;
		flag = 'e' ;
		getss(s2) ;
		char b1[105] , b2 = aa ;
		strcpy(b1,a) ;
		sscanf(b1,"%lf",&y) ;
	
		if(flag == 'm')
			y /= 1000 ;
		else if(flag == 'k')
			y *= 1000 ;
		else if(flag == 'M')
			y *= 1000000 ;
		
		gets(s3) ;
		
		
		
		cout << "Problem #" << t++ << endl ;
		if(a2 == 'A' && b2 == 'W')
			printf("U=%.2lfV
",double(y*1.0/x)) ;
		else if(a2 == 'W' && b2 == 'A')
			printf("U=%.2lfV
",double(x*1.0/y)) ;
		else if(a2 == 'V' && b2 == 'W')
			printf("I=%.2lfA
",double(y*1.0/x)) ;
		else if(a2 == 'W' && b2 == 'V')
			printf("I=%.2lfA
",double(x*1.0/y)) ;
		else if(a2 == 'V' && b2 == 'A' || a2 == 'A' && b2 == 'V')
			printf("P=%.2lfW
",double(y*1.0*x)) ;
		cout << endl ;
			
	}
	return 0 ;
}

 在网上也发现一些其他方法解决了此题,下面介绍一种方法,从中学到一些:

头文件 #include<sstream>

char s[100] ;

gets(s) ;

istringstream sin(s) ;

double d ;

int i = 0 ;

char s1 ;

while(sin>> s1)  {

if(s1>='0'&&s1 <= '9')

  sin >> d ;

}

变量d中存放的就是字符类型对应的数值类型

#include<iostream>
#include<sstream>
#include<string>
#include<cstdio>
using namespace std;

int main()
{
    /*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //*/

    int T;
    cin>>T;getchar();
    for(int case_num=1;case_num<=T;case_num++)
    {
        string line;
        getline(cin,line);
        double P(-1.0),U(-1.0),I(-1.0);
        istringstream sin(line);
        char ch;
        while(sin>>ch)
        {
            if(ch=='P')
            {
                char t;
                sin>>t;
                if(t!='=')
                    continue;
                sin>>P;
                sin>>t;
                if(t=='m')
                    P/=1000;
                else if(t=='k')
                    P*=1000;
                else if(t=='M')
                    P*=1000000;
            }
            else if(ch=='U')
            {
                char t;
                sin>>t;
                if(t!='=')
                    continue;
                sin>>U;
                sin>>t;
                if(t=='m')
                    U/=1000;
                else if(t=='k')
                    U*=1000;
                else if(t=='M')
                    U*=1000000;
            }
            else if(ch=='I')
            {
                char t;
                sin>>t;
                if(t!='=')
                    continue;
                sin>>I;
                sin>>t;
                if(t=='m')
                    I/=1000;
                else if(t=='k')
                    I*=1000;
                else if(t=='M')
                    I*=1000000;
            }
        }

        cout<<"Problem #"<<case_num<<endl;
        if(P==-1.0)
            printf("P=%.2fW
",U*I);
        else if(U==-1.0)
            printf("U=%.2fV
",P/I);
        else
            printf("I=%.2fA
",P/U);
        printf("
");
    }

    return 0;
}

 istringstream 用起来确实比较方便

原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237459.html