華爲軟件訓練營培訓前自測題(黑色爲網上看到版本,藍色爲自己寫的,紅色爲修改後的版本)

題目概述

輸入一個長度爲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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章