UVA1597--Bug Hunt

题目:
输入并模拟一段程序,输出第一个bug所在的行。每行程序有两种可能:
数组定义:格式为arr[size],例如a[10];
赋值语句:格式为arr[index]=value,例如a[0]=3或者a[a[0]]=3
赋值语句可能会出现两种bug:下标index越界,使用未初始化变量。
思路:
定义数组类Array,包含长度,已经赋值的下标集合map,所有的数组用map处理,key未数组名,value为对应的Array对象。
采用递归求值,求值过程中判断是否出错。最后判断赋值和声明时是否出错。
代码如下:

#include<iostream>
#include<string.h>
#include<string>
#include<vector>
#include<sstream>
#include<cctype>
#include<map>
using namespace std;

class Array {//一个数组,包含长度和已经赋值的下标
public:
    Array(int l = 0) : len(l) {}
    int len;//长度
    map<int, int> value;//赋值的下标
};

map<string, Array> mmap;//存储声明的数组
bool flag = true;

//获得数组的名字
string getName(string str) {
    return str.substr(0, str.find_first_of('['));
}

//获取[]中的内容
string getValue(string str) {
    int pos1 = str.find_first_of('[');
    int pos2 = str.find_last_of(']');
    return str.substr(pos1 + 1, pos2 - pos1 - 1);
}

//递归获得值
int getNum(string str) {
    if(isdigit(str[0])) {
        int pos = 0;
        stringstream ss(str);
        ss >> pos;
        return pos;
    } else {
        string name = getName(str);
        int pos = getNum(getValue(str));
        if(!mmap[name].value.count(pos)){
            flag = false;
            return 0;
        }
        return mmap[name].value[pos];
    }
}

//添加节点
bool addArray(string str) {
    string name = getName(str);
    flag = true;
    int len = getNum(getValue(str));
    if(!flag)
        return false;
    mmap[name] = Array(len);
    return true;
}

//处理赋值等号前半部分
bool dealFront(string str_front, int &pos_f){
    string name = getName(str_front);
    flag = true;
    pos_f = getNum(getValue(str_front));
    if(!flag)
        return false;
    if(mmap[name].len <= pos_f)
        return false;
    return true;
}

//处理赋值等号后半部分
bool dealBack(string str_back, int &value_b){
    flag = true;
    value_b = getNum(str_back);
    if(!flag)
        return false;
    return true;
}

//赋值
bool massign(string row) {
    int equelpos = row.find_first_of('=');
    string str_front = row.substr(0, equelpos);
    string str_back = row.substr(equelpos + 1);
    int pos_f = 0;
    int value_b = 0;
    if(!dealFront(str_front, pos_f)) return false;
    if(!dealBack(str_back, value_b)) return false;
    string name = getName(str_front);
    mmap[name].value[pos_f] = value_b;
    return true;
}

int main() {
    string str;
    while(cin >> str) {
        if(str[0] == '.')
            break;
        mmap.clear();
        vector<string> vv;
        vv.push_back(str);
        string ss;
        while(cin >> ss) {
            if(ss[0] == '.')
                break;
            vv.push_back(ss);
        }
        int pos = 0;
        for(int i = 0; i < vv.size(); i++) {
            string row = vv[i];
            if(row.find_first_of('=') == row.npos) { //声明数组
                if(!addArray(row)) {
                    pos = i + 1;
                    break;
                }
            } else { //赋值
                if(!massign(row)) {
                    pos = i + 1;
                    break;
                }
            }
        }
        cout << pos << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值