#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N=105;
int n;
bool fixture;//标记输入待处理地址后面是否有'/'
vector<string> url;//中转时候存储待处理地址
vector<string> data;//输出时候存储的uml地址
struct rule{
vector<string>rule;
string name;
bool flag;
}r[N];
bool isright(string s){ //判断输入是否都为数字
for(int i=0;i<s.length();i++){
if(!isdigit(s[i])){
return false;
}
}
return true;
}
void init( ){ //初始化,输入规则语句
int pos=0;
string temp;
char a[110];//临时进行存储
for(int i=1;i<=n;i++){
cin>>a;
int end=strlen(a);
if(end>0&&a[end-1]=='/'){
r[pos].flag=true;
}
else r[pos].flag=false;
cin>>r[pos].name;
char *sp=strtok(a,"/");
while(sp){
r[pos].rule.push_back(sp);
sp=strtok(NULL,"/");
}
pos++;
}
}
bool legal(char *s){ //判断输入的字符数组是否合法
for(int i=0;i<strlen(s);i++){
if(s[i]!='/'&&s[i]!='.'&&s[i]!='_'&&s[i]!='-'&&!(isalpha(s[i])||isdigit(s[i])))
return false;
}
return true;
}
void match(char *a){ //进行匹配
url.clear();
char *sp=strtok(a,"/");
while(sp){
url.push_back(sp);
sp=strtok(NULL,"/");
}
for(int i=0;i<n;i++){
int j,k;
data.clear();
bool flag=true;
for(j=0,k=0;j<r[i].rule.size()&&k<url.size();j++,k++){
string s=r[i].rule[j];
if(s=="<int>"){ //第一种int类型
if(!isright(url[k])){
flag=false;
break;
}
else{
string str=url[k];
for(int t=0;t<str.length()&&str[t]=='0';t++){ //去掉数字前面多余的0
str.erase(t,1);
}
if(str!=""){
data.push_back(str);
}
}
}
else if(s=="<str>"){ //第二种str类型
data.push_back(url[k]);
}
else if(s=="<path>"){
string temp=url[k];
for(++k;k<url.size();k++){
temp=temp+"/"+url[k];
}
if(fixture){
temp+="/";
}
data.push_back(temp);
}
else { //完全不匹配
if(s!=url[k]){
flag=false;
break;
}
}
}
if(flag&&j>=r[i].rule.size()&&k>=url.size()&&r[i].flag==fixture){
cout<<r[i].name;
for(int ii=0;ii<data.size();ii++){
cout<<" "<<data[ii];
}
cout<<endl;
return;
}
}
cout<<"404"<<endl;
}
int main(){
int m;
string s;
cin>>n>>m;
init();
while(m--){
char a[110];
cin>>a;
int end=strlen(a);
if(end>0&&a[end-1]=='/'){
fixture=true;
}
else fixture=false;
if(!legal(a)){
cout<<"404"<<endl;
continue;
}
match(a);
}
return 0;
}
学习一下关于strtok的使用,用于分割字符串,注意会破坏被分解字符串的完整,调用前和调用后的s已经不一样了;
需要设置指针进行判断,循环进行放置;
下面例子用于复习关于strtok的使用;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[]="ab,cd,ef";
printf("before strtok: str=%s\n",str);
printf("begin:\n");
char *ptr = strtok(str, ",");
while(ptr != NULL){
printf("str=%s\n",str);
printf("ptr=%s\n",ptr);
ptr = strtok(NULL, ",");
}
system("pause");
return 0;
}