题目概述
输入一个长度为N(字符串长度不定)的字符串,字符均为英文字符
请完成如下功能:
1)根据输入的字符串,产生n个字符子串
字符子串生成规则:分隔符是空格,字符子串的排列顺序与原始字符串保持一致,且不包含分隔符
2)根据要求输出某个序号的字符子串,序号1~n表示。
示例:
输入的原始字符串为“ Welcome to
要求输出的第1个字符子串,则输出结果应为“Welcome”
要求输出的第2个字符子串,则输出结果应为“to”
要求输出的第6个字符子串,则输出结果应为“camp!”
请实现如下接口:
接口1:InputString
Description
Prototype
Input Param
接口2: FindSubString
Description
Prototype
Input Param
Output Param
接口3: Clear
Description
Prototype
网上转来的一篇简短小程序:
#include <iostream>
#include <memory>
#include "string"
#include <vector>
using namespace std;
static int num = 0;
static char** strArray = NULL;
//
/***
char last_get_char=' ';
if(*pInString == ' ' || *pInString == '\0')//这样改就可以了
if(last_get_char==' ')
continue;
else
num++;
}
last_get_char=*pInString;
**/
//注意ppOutString的处理方式和它与实参的联系
void FindSubString(int SerialNumber, char** ppOutString)
{
}
void Clear()
{
}
int main(){
}
自己的程序稍后上传
/*******************************************************************************
File Name : main.cpp
Version : 1.0
Author : Eric
Created : 2012/5
Last Modified :
Description :
1) 根据输入的字符串,产生n个字符子串
字符子串生成规则:
分隔符是空格,字符子串的排列顺序与原始字符串保持一致,且不包含分隔符
2)根据要求输出某个序号的字符子串,序号1~n表示。
Function List :
//计算字符子串数目,转化为字符串,
void SumStringMakeList(char* pInString);
//字符链表转化为字符串
void CharList2ArrString(char* pInString);
//接口1 输入字符串
void InputString(char* pInString);
//接口2 查找字符串
void FindSubString(int SerialNumber, char** ppOutString);
//接口3 释放空间
void Clear(void);
History :
1.Date : 2012/5
Author : Eric
Modification: Created file
******************************************************************************/
#include <iostream>
#include <string>
#include "stdlib.h"
using namespace std;
//*********字符链表*********
typedef struct charnode
{
char data;
struct charnode* next;
}charnode,*pCharLinkList;
pCharLinkList head_char_list;
//静态全局变量 字符子串头指针
static char** OutStrings;
//静态全局变量 字符子串的字符数
static int* CharOfString;
//静态全局变量 字符子串数量
static int NumOfString=0;
char* testlist={" this is a testline of this program hahahahahahahahahahhahahhahahahahahahahah "};
//计算字符子串数量,转化为字符串,
void SumStringMakeList(char* pInString);
//字符链表转化为字符串
void CharList2ArrString(char* pInString);
//接口1
void InputString(char* pInString);
//接口2
void FindSubString(int SerialNumber, char** ppOutString);
//接口3
void Clear(void);
//帮助函数
void Help(void);
int main()
{
int SerialNumber=0;
char * outputstring;
Help();
cout<<testlist<<endl;
InputString(testlist);
cout <<endl<< "the testline have "<< NumOfString<<" strings"<<endl;
for(SerialNumber=1;SerialNumber<=NumOfString;SerialNumber++)
{
FindSubString( SerialNumber,&outputstring);
cout<<outputstring<<endl;
}
Clear();
return 0;
}
void Help(void)
{
cout << "this program is a program of pre-test of huawei software training camp"
"you can modify the testline if you want \n"
"the output is output the strings in the testline in order \n"
"Copyright (C), 2012-2013,Eric Huawei Tech. Co., Ltd.\n"
"\n"
"\n" ;
}
void InputString(char* pInString)
{
SumStringMakeList(pInString);
CharList2ArrString(pInString);
}
void SumStringMakeList(char* pInString)
{
char inputed_char;
char last_inputed_char=' ';
charnode *s, *r=NULL;
head_char_list=(charnode * )malloc(sizeof(charnode));
head_char_list->data='0';
head_char_list->next=NULL;
while(pInString)
{
//构建字符链表
inputed_char=*pInString;
if(inputed_char==' '||inputed_char=='\0')
{
if(inputed_char=='\0')
{
if(last_inputed_char!=' ')//让链表的最后都改存成'\0'
{
NumOfString++;
s=(charnode*)malloc(sizeof(charnode));
s->data=' ';
s->next=NULL;
if(head_char_list->next==NULL)
{
s->next=head_char_list->next;
head_char_list->next=s;
}
else r->next=s;
r=s;//当前尾节点
}
return;
}
if(inputed_char==' ')
{
if(last_inputed_char==' ')//如果是分隔符
{//上个字符为分隔符则不保存 不计数
pInString++;
continue;
}
else
{
NumOfString++;
}
}
}
s=(charnode*)malloc(sizeof(charnode));
s->data=inputed_char;
s->next=NULL;
if(head_char_list->next==NULL)
{
s->next=head_char_list->next;
head_char_list->next=s;
}
else r->next=s;
cout<<s->data;//测试链表用
r=s;//当前尾节点
last_inputed_char=inputed_char;
pInString++;
}
}
void CharList2ArrString(char* pInString)
{
char inputed_char;
int indexofstring=0,indexofchar=0;
int NumOfCharOfNowString=0;
char last_inputed_char=' ';
CharOfString = new int[NumOfString];
OutStrings = new char*[NumOfString];
//先遍历得知每个string的长度
while(pInString)
{//构建字符链表
inputed_char=*pInString;
if(inputed_char==' '||inputed_char=='\0')
{
if(inputed_char=='\0')
{//如果是结尾符,不计数保存上个string的char数
CharOfString[indexofstring]=NumOfCharOfNowString;
break;
}
if(last_inputed_char==' ')//如果是分隔符
{//上个字符为分隔符,则不保存不计数入
pInString++;
continue;
}
else
{
CharOfString[indexofstring]=NumOfCharOfNowString;
NumOfCharOfNowString=0;//归零
indexofstring++;//自增
}
}
//不是结尾符 不是分隔符计数
if(inputed_char!=' ')
NumOfCharOfNowString++;//
last_inputed_char=inputed_char;
pInString++;
}
for(int i=0;i<NumOfString;i++)
{
cout<<CharOfString[i]<<' ';
}
cout<<endl;
for(indexofstring=0;indexofstring<NumOfString;indexofstring++)
{
OutStrings[indexofstring] = new char[CharOfString[indexofstring]];
}
indexofstring=0;
indexofchar=0;
//链表递出 赋值销毁
while(head_char_list->next)
{
indexofchar++;
if(head_char_list->next->data==' ')
{
OutStrings[indexofstring][indexofchar-1]='\0';
indexofstring++;
indexofchar=0;
}
else
{
OutStrings[indexofstring][indexofchar-1]=head_char_list->next->data;
}
//此处还应加链表释放
charnode* p=head_char_list->next;
free(head_char_list);
head_char_list=p;
}
delete[]CharOfString;
}
void Clear()
{
for(int i = 1; i < NumOfString; i++)
delete [] OutStrings[i];//不知为何此处用 delete[]OutStrings[i];报错
delete[] OutStrings;
return;
}
void FindSubString(int SerialNumber, char** ppOutString)
{
if(SerialNumber >= 1 && SerialNumber <= NumOfString)
*ppOutString = OutStrings[SerialNumber - 1];
else
*ppOutString = NULL;
}
//空间释放的时候有问题,时而通过时而通不过。。。。 delete 用的有问题 写入越界!
改正后的 通过的
/******************************************************************************
Copyright (C), 2001-2011, Huawei Tech. Co., Ltd.
******************************************************************************
File Name : FindSubString.cpp
Version :
Author :
Created : 2012/5
Last Modified :
Description :
Function List :
History :
1.Date : 2012/5
Author : Eric
Modification: Created file
******************************************************************************/
#include <iostream>
#include <string.h>
#include "stdlib.h"
using namespace std;
//*********字符链表*********
typedef struct charnode
{
char data;
struct charnode* next;
}charnode,*pCharLinkList;
pCharLinkList head_char_list;
//静态全局变量 字符子串头指针
static char** OutStrings;
//静态全局变量 字符子串的字符数
static int* CharOfString;
//静态全局变量 字符子串数量
static int NumOfString=0;
//计算字符子串数量,转化为字符串,
void SumStringMakeList(char* pInString);
//字符链表转化为字符串
void CharList2ArrString(char* pInString);
//接口1
void InputString(char* pInString);
//接口2
void FindSubString(int SerialNumber, char** ppOutString);
//接口3
void Clear(void);
//帮助函数
/******************************************************************************************************
Description : 输入原始字符串
Prototype : void InputString(char* pInString);
Input Param : pInString 原始字符串。pInString指向的字符串存储空间在函数外会被释放,请自行申请存储空间
Output Param : 无
Return Value : 无
********************************************************************************************************/
void InputString(char* pInString)
{
/* 在这里实现功能 */
SumStringMakeList(pInString);
CharList2ArrString(pInString);
return;
}
void SumStringMakeList(char* pInString)
{
char inputed_char;
char last_inputed_char=' ';
charnode *s, *r=NULL;
head_char_list=(charnode * )malloc(sizeof(charnode));
head_char_list->data='0';
head_char_list->next=NULL;
while(pInString)
{
//构建字符链表
inputed_char=*pInString;
if(inputed_char==' '||inputed_char=='\0')
{
if(inputed_char=='\0')
{
if(last_inputed_char!=' ')//让链表的最后都改存成'\0'
{
NumOfString++;
s=(charnode*)malloc(sizeof(charnode));
s->data=' ';
s->next=NULL;
if(head_char_list->next==NULL)
{
s->next=head_char_list->next;
head_char_list->next=s;
}
else r->next=s;
r=s;//当前尾节点
}
return;
}
if(inputed_char==' ')
{
if(last_inputed_char==' ')//如果是分隔符
{//上个字符为分隔符则不保存 不计数
pInString++;
continue;
}
else
{
NumOfString++;
}
}
}
s=(charnode*)malloc(sizeof(charnode));
s->data=inputed_char;
s->next=NULL;
if(head_char_list->next==NULL)
{
s->next=head_char_list->next;
head_char_list->next=s;
}
else r->next=s;
r=s;//当前尾节点
last_inputed_char=inputed_char;
pInString++;
}
}
void CharList2ArrString(char* pInString)
{
char inputed_char;
int indexofstring=0,indexofchar=0;
int NumOfCharOfNowString=0;
char last_inputed_char=' ';
CharOfString = new int[NumOfString];
OutStrings = new char*[NumOfString];
//先遍历得知每个string的长度
while(pInString)
{//构建字符链表
inputed_char=*pInString;
if(inputed_char==' '||inputed_char=='\0')
{
if(inputed_char=='\0')
{//如果是结尾符,不计数保存上个string的char数
if(last_inputed_char!=' ')
CharOfString[indexofstring]=NumOfCharOfNowString;
break;
}
if(last_inputed_char==' ')//如果是分隔符
{//上个字符为分隔符,则不保存不计数入
pInString++;
continue;
}
else
{
CharOfString[indexofstring]=NumOfCharOfNowString;
NumOfCharOfNowString=0;//归零
indexofstring++;//自增
}
}
//不是结尾符 不是分隔符计数
if(inputed_char!=' ')
NumOfCharOfNowString++;//
last_inputed_char=inputed_char;
pInString++;
}
for(indexofstring=0;indexofstring<NumOfString;indexofstring++)
{
OutStrings[indexofstring] = new char[CharOfString[indexofstring]+1];
}
delete[]CharOfString;
indexofstring=0;
indexofchar=0;
//链表递出 赋值销毁
while(head_char_list->next)
{
indexofchar++;
if(head_char_list->next->data==' ')
{
OutStrings[indexofstring][indexofchar-1]='\0';
indexofstring++;
indexofchar=0;
}
else
{
OutStrings[indexofstring][indexofchar-1]=head_char_list->next->data;
}
//此处还应加链表释放
charnode* p=head_char_list->next;
free(head_char_list);
head_char_list=p;
}
}
/*****************************************************************************
Description : 输出排序后指定的某个字符串
Prototype : void FindSubString(int SerialNumber, char** ppOutString)
Input Param : SerialNumber 排序后的序列号,从1~N为按照字典从小到大的排列顺序
Output Param : *ppOutString 指针指向字符子串的首地址,字符串必须以’\0’结束。
如果SerialNumber非法,将*ppOutString指向空字符串。
Return Value : 无
*****************************************************************************/
void FindSubString(int SerialNumber, char** ppOutString)
{
/* 在这里实现功能 */
if(SerialNumber >= 1 && SerialNumber <= NumOfString)
*ppOutString = OutStrings[SerialNumber - 1];
else
*ppOutString = "";
return;
}
/*****************************************************************************
Description : 清除字符串序列的存储空间
Prototype : void Clear(void)
Input Param : 无
Output Param : 无
Return Value : 无
*****************************************************************************/
void Clear(void)
{
/* 在这里实现功能 */
for(int i = 0; i < NumOfString; i++)
delete [] OutStrings[i];//不知为何此处用 delete[]OutStrings[i];报错
delete[] OutStrings;
return;
}