Codeforce727B --- Bill Total Value(字符串处理 正则表达式)

先说一下正则表达式

%*[a-z]表示忽略前面的小写字符,%[0-9]表示把紧接着非字符的连续数字存入t字符串中去;

  从"abc123de4f"中得到"123";

#include <stdio.h>
int main()
{
    char s[50] = "abc123de4f", t[50] = {0};
    sscanf(s, "%*[a-z]%[0-9]", t);
    printf("%s
", t);///结果: 123
    return 0;
}

  从"Abc12.3de4f"中得到"12.3"

#include <stdio.h>
int main()
{
    char s[50] = "Abc12.3de4f", t[50] = {0};
    sscanf(s, "%*[^0-9]%[0-9.]", t);
    printf("%s
", t);///结果: 12.3
    return 0;
}

  

  从"2442932358@qq.com"中得到"@qq.com"

#include <stdio.h>
int main()
{
    char s[50] = "2442932358@qq.com", t[50] = {0};
    sscanf(s, "%*[^@]%s", t);
    printf("%s
", t);///结果: @qq.com
    return 0;
}

  从"2442932358@qq.com"中得到"qq.com"

#include <stdio.h>
int main()
{
    char s[50] = "2442932358@qq.com", t[50] = {0};
    sscanf(s, "%*[^@]@%s", t);
    printf("%s
", t);///结果: 12.3
    return 0;
}

  还有很多可以慢慢尝试;

题目链接:http://codeforces.com/contest/727/problem/B

题意:有一个采购单以字符串的形式给出,里面按顺序包括“物品名+价钱”,没有“+”号,物品名是由小写英文字符组成,价钱有两种形式,带美分的和不带美分的,其中带美分的是由小数点加两位数字构

的,美元部分则由小数点每隔3位分开一次,例如123.45表示123.45美元,12.345表示12345美元,1.234.45表示1234.45美元,现在要求所有物品的价格之和

输出格式按照输入格式来处理;

输出格式有两种:

1. 全是整数的,没有.00这种形式

2. 有小数部分的,小数部分不为0的保留两位小数;

#include <stdio.h>
#include <string.h>
#define N 5200
int main()
{
    char s[N]={0}, next[N]={0}, p[N]={0}, t[N] = {0};

    while(scanf("%s", s+1) != EOF)
    {
        s[0] = 'a';///以下正则表达式的规则是以字符开头,数字结尾的;
        double sum = 0;
        int f = 0;
        ///正则表达式求s串中从前面开始的数字部分以字符串的形式存入p中,剩余部分存入next中;
        ///
        while(sscanf(s, "%*[^0-9]%[0-9.]%[^]", p, next) > 0)
        {
            double num1 = 0, num2 = 0;///num1是小数部分的值,num2是整数部分的值;
            int len = strlen(p), flag = 0;
            if(len>3 && p[len-3] == '.')
            {
                sscanf(p+len-3, "%lf", &num1);///把小数部分转化成double;
                flag = f = 1;///说明是2位小数;
            }
            if(flag == 1) len = len - 3;
            for(int i=0; i<len; i++)///处理整数部分;
            {
                if(p[i] == '.') continue;
                num2 = num2*10 + (p[i]-'0');
            }
            sum += num1 + num2;

            strcpy(s, next);///循环处理剩余部分;
            memset(next, 0, sizeof(next));///要清空的;
        }

        sprintf(t, "%.2f", sum);///再把结果保存为字符串,方便输出;

        int len = strlen(t), k = 0;
        char ans[N];///保存结果;

        if(f == 0)len -= 3;///没有小数部分的;
        if(f == 1)///2位小数;
        {
            ans[k++] = t[--len];
            ans[k++] = t[--len];
            ans[k++] = t[--len];
            if(ans[0] == '0' && ans[1] == '0')k = 0;///小数部分为0的,不输出;
        }

        for(int i=len-1, counts=1; i>=0; i--,counts++)
        {
            if(counts%3==1 && counts!=1)
                ans[k++] = '.';
            ans[k++] = t[i];
        }
        for(int i=k-1; i>=0; i--)
            printf("%c", ans[i]);
        printf("
");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/5992444.html