重点说下getOrder()这个函数,该函数实现的功能是:
1.接收一行用户输入。
2.根据空格将用户输入分割成字符串数组。数组中下标为0的元素的第一个字符存储的是一个整型变量,代表有效字符串数,即一条命令及其所带参数所对应的字符串数。
代码:
string* CmdControl<T>::getOrder(){
string order;//该字符串是用户输入的原始字符串,包括空格符
getline(cin,order);
int num = 1;
deque<string> orders;//以空格为分隔符,将截取到的子串存入该容器中
int from = 0;//子串头部下标
int len = 1;//子串长度
for(int i = 0; i < order.size();i++){
if(order[i] == ' '){//读到空格符时将之前标记的字符串存入容器
orders.push_back(order.substr(from,len-1));
from = i+1;
len = 1;
num++;
}
else len++;
}orders.push_back(order.substr(from));//存入读得的最后一个子串
string *result = new string[num+1];//result是要返回的字符串数组,预留出0号单元
result[0].append(1,(char)num);//0号字符串存储的是数量信息
deque<string>::iterator itr = orders.begin();
for(int i = 1;i <= num; i++){//将容器里的字符串存入result数组
result[i] = *itr;
itr++;
}
return result;
}
最后是run函数,该函数调用getOrder与match函数进行命令的匹配及对应函数调用:
void run() {
running = true;
while(running){
cout<<prompt<<":";//输出命令行提示符
string *orderInput = getOrder();
if(orderInput[1].length() == 0) continue;//用户仅只敲了个回车
//将加工后的参数数据传递给相应函数
int funNum = match(orderInput[1]);//若未匹配得内置命令则返回-1
if(funNum == -1) cout<<cmdNotExist<<endl;//并输出自定义的错误提示信息
//否则funNum为命令在cmdList中的下标,并调用相应函数执行命令功能
else running = (holder.*(cmdList[funNum].fun))(orderInput);
}
}
可能在多道程序环境中这个应该写成一个线程,但现在还没去实现它。
源代码的下载链接
具体下载目录在 /2012年资料/12月/22日/C++可复用代码:命令行控制模块