11:题目概述
输入一个长度为N(字符串长度不定)的字符串,字符均为英文字符
请完成如下功能:
1)根据输入的字符串,产生n个字符子串
字符子串生成规则:分隔符是空格,字符子串的排列顺序与原始字符串保持一致,且不包含分隔符
2)根据要求输出某个序号的字符子串,序号1~n表示。
示例:
输入的原始字符串为“ Welcome to HuaWei software training camp! ”
要求输出的第1个字符子串,则输出结果应为“Welcome”
要求输出的第2个字符子串,则输出结果应为“to”
要求输出的第6个字符子串,则输出结果应为“camp!”
请实现如下接口:
接口1:InputString
Description : 输入原始字符串
Prototype : void InputString(char* pInString);
Input Param : pInString 原始字符串。pInString指向的字符串存储空间在函数外会被释放,请自行申请存储空间
接口2: FindSubString
Description : 输出排序后指定的某个字符串
Prototype : void FindSubString(int SerialNumber, char** ppOutString)
Input Param : SerialNumber:从1~n为字符子串序号
Output Param : *ppOutString 指针指向字符子串的首地址,字符串必须以’\0’结束。
如果SerialNumber非法,将*ppOutString指向空字符串。
接口3: Clear
Description : 清除字符子串序列的存储空间
Prototype : void Clear(void)
#include <iostream>
#include <memory>
#include "string"
#include <vector>
using namespace std;
static int num = 0;
static char** strArray = NULL;
void SetSubStringNum(char* pInString)
{
while(pInString)
{
if(*pInString == ' ' || *pInString == '\0')
num++;
if(*pInString == '\0')
return;
pInString++;
}
}
//这个函数写的很好
void SetStringArray(char* pInString)
{
strArray = new char*[num];
int subIndex = 0, subLen = 0;
while(pInString)
{
subLen++;
if(*pInString == ' ' || *pInString == '\0')
{
strArray[subIndex] = new char[subLen];
memcpy(strArray[subIndex], pInString - subLen + 1, subLen);
strArray[subIndex][subLen] = '\0';
subIndex++;
subLen = 0;
}
if(*pInString == '\0')
return;
pInString++;
}
}
void InputString(char* pInString)
{
SetSubStringNum(pInString);
SetStringArray(pInString);
}
//注意ppOutString的处理方式和它与实参的联系
void FindSubString(int SerialNumber, char** ppOutString)
{
if(SerialNumber >= 1 && SerialNumber <= num)
*ppOutString = strArray[SerialNumber - 1];
else
*ppOutString = NULL;
}
void Clear()
{
for(int i = 0; i < num; i++)
delete[] strArray[i];
delete[] strArray;
}
int main(){
InputString("Welcome to HuaWei software training camp!");
char* OutString;
//注意第二个参数
FindSubString(3, &OutString);
cout << OutString << endl;
char c;
cin >> c;
return 0;
}