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 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.]%[^\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; }