题目
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 32768K,其他语言 65536K题目描述
在项目开发过程中,经常会遇到需要读写各类配置文件的场景。ini就是一种比较场景、通用的配置文件格式,要求考生实现一个ini文件解析工具,并按照指定格式输出解析结果
输入描述:
符合ini规则的文件内容(考生不需要考虑非法输入问题),例如:
;test case
[section1]
key1 = value1
[section2]
key1 = value1
说明:
1. 以分号“;”起始部分为注释,可能独占一行注释一个段落;也可能出现在行尾,注释某一行
2. section名称已中括号包裹
3. 每个section内有1个或者多个key/value对
4. key和value以等号“=”分割,等号前后允许有空格
输出描述:
通过输入解析出所有配置,每个配置应该包含三个部分:section、key、value;要求按照如下规则输出所有字段:
输出所有解析后的配置,三个字段分别用大括号“{}”包裹,其中不同section按照section名称排序,同一section内按照key值排序(排序规则同一使用ASCII码表从小到大排列)
{section}{key}{value}
示例1
输入
;test case
[section1]
key2=value2
key1=value1
输出
{section1}{key1}{value1}
{section1}{key2}{value2}
备注:
INI文件由节、键、值组成。
节
[section]
参数(键=值)
name=value
注解
注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
代码
#include<iostream>
#include<cstring>
#include <algorithm>
using namespace std;
struct node
{
int id;//记录当前(,)属于section
char key[10];
char value[10];
};
int cmp(const node &a,const node &b)//从小到大比较
{
return a.key < b.key;
}
int main()
{
char s[100];
int a[1000];
node b[1000];
//freopen("in.txt" , "r" , stdin);
int id = 0;//section个数
int node_id=0;//(,)个数
int i;
for(i=0;i<999;i++)
{
a[i]=0;
b[i].id=0;
}
while(gets(s))
{
if(s=="") break;//停止判定条件 读入的字符串是空串
if(s[0]==';')
continue;
if(s[0]=='[')
{
int len = strlen(s);
i = len-2;
id = 0;
while(s[i]<='9')
id = 10*id+(s[i--]-'0');//找到section
}
if(s[0]=='k')
{
int len = strlen(s);
i = 0;
for(i=0;i<=len-1;i++)
if(s[i]=='=')
break;
if(s[i-1]==' ')//仅考虑=两边只有一个空格
{
int k;
for(k=0;k<=i-2;k++)
b[node_id].key[k]=s[k];
b[node_id].key[k]='\0';
for(k=i+2;k<=len-1;k++)
b[node_id].value[k-i-2]=s[k];
b[node_id].value[k-i-2]='\0';
b[node_id].id = id;
node_id++;
a[id]++;
}
else
{
int k;
for(k=0;k<=i-1;k++)
b[node_id].key[k]=s[k];
b[node_id].key[k]='\0';//字符串末尾补结束符
for(k=i+1;k<=len-1;k++)
b[node_id].value[k-i-1]=s[k];
b[node_id].value[k-i-1]='\0';
b[node_id].id = id;
node_id++;
a[id]++;
}
}
}
int h=0;
sort(b,b+node_id,cmp);
i = 0;
for(i=0;i<999;i++)
{
if(a[i])
{
int j=0;
for(j=0;j<node_id;j++)
if(b[j].id==i)
{
cout<<"{section"<<i<<"}";
cout<<"{"<<b[j].key<<"}";
cout<<"{"<<b[j].value<<"}";
cout<<endl;
}
}
}
return 0;
}
测试数据
;test case
[section1]
key2 = value2
key1 = value1
[section0]
key2 = value2
key1 = value1
[section88]
key2 = value2
key1 = value1
[section1]
key0 = value0