• 字符串中如何提取数值


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

    可以使用 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 用起来确实比较方便

  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237458.html
Copyright © 2020-2023  润新知