题意:
模拟c++的输入,如果输入的字符串大于声明的空间就会寻找下一个字符串直到找到'\0'
坑点:gets name 的第一个空格后都是输入的内容
ACcode:
#include <bits/stdc++.h>
using namespace std;
#define maxn 11111
string name[maxn];
int len1[maxn],len2[maxn];
char tmp[maxn];
map<string ,int>vis;
int main(){
int loop;
scanf("%d",&loop);
while(loop--){
scanf("%s",tmp);
vis.clear();
memset(len1,0,sizeof(len1));
memset(len2,0,sizeof(len2));
for(int i=0;i<maxn;++i)name[i]="";
int tot=1;
while(1){
scanf("%s",tmp);
int len=strlen(tmp);
name[tot]="";
bool flag=true;
int k;
for(k=0;flag&&k<len;++k){
if(tmp[k]!='[')
name[tot]+=tmp[k];
else flag=false;
}
len1[tot]=0;
flag=true;
for(;flag&&k<len;++k)
if(isdigit(tmp[k]))
len1[tot]=len1[tot]*10+tmp[k]-'0';
else flag=false;
vis[name[tot]]=tot;
if(tmp[k]==';')break;
tot++;
}
while(scanf("%s",tmp)&&tmp[0]!='r'){
if(tmp[0]=='g'){
scanf("%s",tmp);
int pos=vis[tmp];
gets(tmp);
int ll=strlen(tmp);
name[pos]="";
int k=1,lll=0;
for(lll=0;k<ll;++k,++lll)
name[pos]+=tmp[k];
name[pos][lll]='\0';
len2[pos]=lll;
}else {
scanf("%s",tmp);
int pos=vis[tmp];
if(len2[pos]==0)cout<<'\12';
else{
if(len1[pos]>len2[pos])
cout<<name[pos]<<'\12';
else {
for(int i=0;i<len1[pos];++i)cout<<name[pos][i];
int k=pos+1;
while(len1[k]<=len2[k]&&len2[k]>0){
for(int i=0;i<len1[k];++i)cout<<name[k][i];
k++;
}
if(len2[k])
cout<<name[k]<<'\12';
else cout<<'\12';
}
}
}
}
scanf("%s",tmp);
}
return 0;
}
/*
1
char a[2], b[1], c[1], d[111];
gets a 1
gets b 2
c a
gets a 11
c a
gets c 33
c a
gets b 22
c a
c b
return 0;
4
char a[1], b[1], c[12];
gets a 123
cout a
return 0;
char a[1], b[2], c[12];
gets a 123
cout a
gets b 123
cout a
cout b
gets b 12
cout a
cout b
retrun 0;
char a[1], b[2], c[12];
gets a 12345
gets c 12
cout a
gets b 12
cout a
cout b
cout c
return 0;
char a[1], b[2], c[12];
gets a 12345
gets c 12
cout a
gets b 1
cout a
cout b
cout c
return 0;
*/