华为软件训练营培训前自测题(黑色为网上看到版本,蓝色为自己写的,红色为修改后的版本)

题目概述

输入一个长度为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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值