題目概述
輸入一個長度爲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')//此處有個bug。。如果有連續的空格則會多計數目。
num++;
if(*pInString == '\0')
return;
pInString++;
}
}
//
/***
void SetSubStringNum(char* pInString)
{
char last_get_char=' ';
while(pInString)
{
if(*pInString
== ' ' || *pInString == '\0')//這樣改就可以了
{
if(last_get_char==' ')
continue;
else
num++;
}
if(*pInString
== '\0')
return;
last_get_char=*pInString;
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;
}
自己的程序稍後上傳
/*******************************************************************************
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;
}