sgu189:Perl-like Substr(字符串处理)

题意:

 

背景:

         一个小型俄罗斯公司H&H决定冲击国际社会以完善他们自己的脚本语言。你被雇佣来参与完成这个工程,你的任务非常简单——码出“子串”的功能部分。

         “子串”功能要用到一下几种操作:

         $value= substr($string, begin, count);

         $value= substr($string, begin);

         substr($string,begin, count) = $newstring;

         substr($string,begin) = $newstring;

         $string(‘$’是一个变量的前缀)表示原本的串。begin表示子串的开头:如果begin>=0,表示左数第begin个(以0为第一个),begin<0代表右数第begin个(以-1为第一个)。count表示子串的长度,如果count>0,表示从begin开始count个字符,如果count<0,表示从begin开始数除了最后-count个字符其他都属于子串。count不等于0。

         “substr”除了可以取出子串,还可以将子串代替为其他的新串。

 

输入格式:

         第一行包括两个自然数N(1<=N<=20)——代表初始化有N行和M(1<=M<=300)——输入u余下有M行。接下来的N行表示变量的初始化(没有一行长度>=10000),以如下形式:

         $name= “value”;

name是变量的名称(总是有一个前缀$),由最多20个字母/数字组成。接下来是一个‘=’号,在接下来是变量的内容value,用一对“”括起来,内容由字母/数字/空格/逗号/点/连字符/下划线/冒号/叹号/问号组成。value的长度不大于255,$name,”=”,”value”之间可以有若干个空格。行末以分号结尾。

接下来的M行包括如下6种操作:

1.      print($name);输出变量name的内容;

2.      print(substr($name, begin,count));输出子串的内容;

3.      $name1 = $name2;将name2的内容赋给变量name1;

4.      $name1 = substr($name2, begin,end);将子串的内容赋给name1;

5.      substr($name1, begin1, count1)= substr($name2, begin2, count2);将前一段子串的内容替换成后一段子串的内容;

6.      substr($name1, begin1, count1)= $name2;用后一个变量的内容代替前一段子串。

变量名和类似print,substr这样的操作名中不包含空格,其他任何地方都有可能有若干个空格。每行以分号结尾,每一行长度不超过255。后面M行中出现的在前N行中没有定义过的变量同一视作空串””。输入中变量个数不大于100。在操作过程中,每个变量的内容长度不超过1000。

substr取得的子串保证不为空。

变量名区分大小写。

 

输出格式:

         输出程序的运行结果,每一行对应一个print()操作。输出不允许添加额外的字符。

 

 

样例:

Input

2 9 
$a = "0123456789"; 
$b = "abcdefghigklmn"; 
print($a); 
print( substr($b, 1, 2) ); 
substr($b, 0, 1) = substr($a, 2, 7); 
$c = $b; 
print(substr($c,0)); 
print(substr($a, -2, -1)); 
print(substr($a, -6, 2)); 
print(substr($a, -5)); 
print(substr($a, 1, 2));


Output

0123456789 
bc 
2345678bcdefghigklmn 

45 
56789 
12

 

感想:

         题意即题解。

         刚开始因为各种没看清题错成shit…自己翻译过后来造福人类…

         顺便学了一下string,stringstream的用法。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <string>
#include <sstream>
using namespace std;
int n, m;
map<string, string> str;

string get_name(string line, int &j)
{
	string name;
	for(j = line.find_first_of('$', j)+1; (line[j] >= 'A'&&line[j]<='Z') || (line[j]>='a'&&line[j]<='z') || (line[j] >= '0'&&line[j] <= '9'); ++j)
		name += line[j];
	if(str.count(name) == 0) str[name] = "";
	j = line.find_first_not_of(' ', j);
	return name;
}	

string get_substr(string line, int &j, string &name, int &pos, int &len)
{
	int length;
	string sub;
	stringstream num;
	j = line.find_first_of('(', j)+1;
	name = get_name(line, j);
	length = str[name].size();
	sub = str[name];
	j = line.find_first_of(',', j)+1;
	j = line.find_first_not_of(' ', j);
	while(line[j] != ' ' && line[j] != ')' && line[j] != ',') 
		num << line[j++];
	num >> pos;
	if(pos < 0) pos += length;
	num.clear();
	j = line.find_first_not_of(' ', j);
	if(line[j] == ',')
	{
		j++;j = line.find_first_not_of(' ', j);
		while(line[j] != ' ' && line[j] != ')' && line[j] != ',') 
			num << line[j++];	
		num >> len;
		num.clear();
		if(len < 0) len = length+len-pos;
	}
	else if(line[j] == ')') len = length-pos;
	j = line.find_first_of(')')+1;
	j = line.find_first_not_of(' ', j);
	sub = sub.substr(pos, len);
	return sub;
}

int main()
{
	string line;
	scanf("%d%d\n", &n, &m);
	for(int i = 1; i <= n; ++i)
	{
		int j = 0;
		string name, val;
		getline(cin, line);
		name = get_name(line, j);
		j = line.find_first_of('"', j)+1;
		for(; line[j] != '"'; ++j)
			val += line[j];
		str[name] = val;
	}
	for(int i = 1; i <= m; ++i)
	{
		int j = 0;
		getline(cin, line);
		j = line.find_first_not_of(' ', j);
		if(line[j] == 'p')
		{
			j = line.find_first_of('(', j)+1;
			j = line.find_first_not_of(' ', j);
			if(line[j] == '$')
				cout << str[get_name(line, j)] << endl;
			else
			{
				string name;
				int pos = 0, len = 0;
				cout << get_substr(line, j, name, pos, len) << endl;
			}
		}
		if(line[j] == '$')
		{
			string name, name2;
			name = get_name(line, j);
			j = line.find_first_of('=', j)+1;
			j = line.find_first_not_of(' ', j);
			if(line[j] == '$')
				str[name] = str[get_name(line, j)];
			else
			{
				int pos = 0, len = 0;
				str[name] = get_substr(line, j, name2, pos, len);
			}
		}
		if(line[j] == 's')
		{
			string name, name2;
			int pos = 0, len = 0, pos2 = 0, len2 = 0;
			get_substr(line, j, name, pos, len);
			j = line.find_first_of('=', j)+1;
			j = line.find_first_not_of(' ', j);
			if(line[j] == '$')
				str[name].replace(pos, len, str[get_name(line, j)]);	
			else 
			{
				get_substr(line, j, name2, pos2, len2);
				str[name].replace(pos, len, str[name2], pos2, len2);
			}
		}
	}
	return 0;	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值