首页 > 代码库 > Codeforce727B --- Bill Total Value(字符串处理 正则表达式)

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\n", 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\n", 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\n", 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\n", 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 5200int 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.]%[^\0]", 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("\n");    }    return 0;}
View Code

 

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