sdut 3567 Memory Leak 模拟

题意:

模拟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;
*/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值