第六章习题参考答案
6_1
6_2
6_3
6_18
/*4. 假设在 main 函数中有如下的说明(数组 a 中存放了 n 个字符串,即名字):
- 1 -(共 22 页)
const int n=10;
char a[n][31] = {"guo li", "li na", "li qi", "liu yan", "ma jing", "sun li juan", "wang le",
"wu da", "yang ke", "zhang yi fu" };
编制具有如下原型的自定义函数:
int search(char (*p)[31], int n, char* name);
负责在字符串数组 p 的前 n 个字符串(名字)中,查找给定串 name 的出现位置(下
标值)并返回,若 p 中不出现 name 的话,返回-1。
并编制主函数,输入要查找的某个名字(字符串)name,而后通过如下形式的语句
对上述函数进行调用,之后输出相关结果(出现位置,即下标值):
int idx = search(a, n, name);
//从 a 数组的第一个名字(0 下标,第 1 行)开始查找
int idx = search(a+3, n, name);
//从 a 数组的第四个名字(3 下标,第 4 行)开始查找
提示:函数 search 的第一个参数 p 为指向一维数组的指针,按照"char (*p)[31]"所说明
的 p 实际上可看作是一个二维字符数组,即是说,p[i]即*(p+i)为一个一维字符数组
(字符串,至多可存放 31 个字符);要查找给定串 name 在 p 中的出现位置(下标
值),可使用如下形式的 if 语句来实现"if( strcmp(p[i], name) == 0 ) return (i);"。
点评:若将形参说明"char (*p)[31]"修改为"char p[][31]",而且其他一切都不必修改,
同样可实现本题所给出的求解任务,从而可体会到指向一维数组的指针形参 p 与二维
形参数组 p 的密切关系。
若将 a 数组中的名字(字符串)按照"字典序"进行了升序排列的话,search 函数中除
可使用顺序查找方式之外,还可按照折半法(二分法)来进行查找。
*/
#include<iostream.h>
#include<string.h>//strcmp(char* ,char *)
int search(char (*p)[31], int n, char* name);
void main(){
const int n=10;
char a[n][31] = {"guo li", "li na", "li qi", "liu yan", "ma jing", "sun li juan", "wang le",
"wu da", "yang ke", "zhang yi fu" };
char *name;
name=new char[31];
cout<<"输入待查的字符串:";
cin.getline(name,80);//error:cin>>name;以空格作为串输入结束的标志。
int p=search(a,n,name);
if(p>=0)
cout<<"a["<<p<<"]="<<a[p];
- 2 -(共 22 页)
else cout<<"没有找到。";
cout<<endl;
/*int p=search(a+3,n,name);
if(p>=0)
cout<<"a["<<p+3<<"]="<<a[p+3];
else cout<<"没有找到。";
cout<<endl;*/
}
int search(char(*p)[31], int n, char* name){
for(int i=0;i<n;i++)
if(strcmp(*p,name)==0) //strcmp(p[i],name)==0)
return i; //*p==p[0]
else
p++;
return -1;
}
/*5. 编制具有如下原型的函数 FindPlace,该函数返回字符串 str 中第一次出现字符 c
的位置(地址值,即指向字符 c 的指针)。如果没有 c 字符则返回空指针 NULL。并
编制主函数对它进行调用以验证其正确性。
char * FindPlace(char *str,char c);
注意:若返回的字符指针值为 p 的话,那么,通过"cout<<p;"形式的语句输出的将是
从 p 指针所指字符开始的子串(系统对输出字符指针值如 p 之值是特殊对待的,对其
他类型指针值的输出则只是输出一个地址值)。
思考:若寻找并返回 c 字符在字符串 str 中最后一次出现的位置的话,实现方式与此类
似。
*/
#include<iostream.h>
#include<string.h>
char * FindPlace(char *str,char c);
void main(){
char str[80]={"ljghslls"},*p,c;
cout<<"输入一串字符:";
cin>>str;
cout<<"输入要查找的字符:";
cin>>c;
p=FindPlace(str,c);
if (p!=NULL)
- 3 -(共 22 页)
cout<<p;//error:cout<<p(p=NULL)
else
cout<<"no found!";
}
char * FindPlace(char *str,char c){
int i=0;
while(*(str+i)!=c&&*(str+i)!='\0')
i++;
if(*(str+i)!='\0')
{
cout<<"位置:"<<i+1;
return str+i;
}
else
return NULL;
}
/*6_6. 编制具有如下原型的函数 findFirst 以及 findLast,而后编制主函数,任意输入
两个字符串,将它们用作实参来调用这两个函数,以验证其正确性。
char * findFirst(char * sourceStr, char * subStr);
char * findLast(char * sourceStr, char * subStr);
findFirst 函数的功能为:返回源串 sourceStr 中第一次出现 subStr 子字符串的头字符
位置(地址值)。如果源串 sourceStr 的长度小于 subStr 子字符串的长度,或者源串
sourceStr 中根本就不出现 subStr 子字符串的话,返回空指针值 NULL。findLast 函数则
要返回源串 sourceStr 中最后一次出现 subStr 子字符串的头字符位置。且要求实现程序
中不可使用"string.h"头文件内有关寻找子串的标准库函数。
提示:findFirst 函数中,首先把 subStr 子串的头位置 j0=0(j0 表示 subStr 字符数组的
下标)与 sourceStr 源串的头位置 j1=0(j1 表示 sourceStr 字符数组的下标)"对齐",而
后逐字符地对两个串进行比较(从左到右),若一直比到了子串的结束各字符均相同
时,则意味着在源串中找到了子串,此时返回子串在源串中的头字符位置(地址值);
若逐字符进行比较时发现有不相同,则要进一步将 subStr 子串的头位置 j0=0 与
sourceStr 的新头位置 j1=1"对齐",而后又一次逐字符地对两个串进行比较(相当于子
串整体"右平移"一个字符后再一次比较),如此等等。findLast 则要首先将子串与源串
的右后部"对齐"进行比较,而后子串逐步整体"左平移"。
*/
#include<iostream.h>
#include<string.h>//strlen()
char * findFirst(char * sourceStr, char * subStr);
- 4 -(共 22 页)
char * findLast(char * sourceStr, char * subStr);
void main(){
char *p,str[80]="How are you! OK,thank you.",substr[80];
cout<<"输入要找的子串:"<<endl;
cin>>substr;
p=findFirst(str,substr);
if(p==NULL)
cout<<"no found"<<endl;
else
cout<<p<<endl;
p=findLast(str,substr);
if(p==NULL)
cout<<"no found"<<endl;
else
cout<<p<<endl;
}
//定义函数 findFirst()
char * findFirst(char * sourceStr, char * subStr){
int j=0;//从第一个开始找
while(*(sourceStr+j)!='\0')
{
int jsub=0;
while(*(subStr+jsub)==*(sourceStr+j)&&*(subStr+jsub)!='\0')
{j++;jsub++;}
if(*(subStr+jsub)=='\0')
{//若是子串结尾退出的循环,则源串中定有子串
cout<<"子串在源串中第一次出现的位置是:"<<j-jsub+1<<endl;
return sourceStr+j-jsub;
}
else
//若子串没有比较完退出 while,则此次比较不匹配,向后移动源串一个字符,接着匹配。
j=j+1;
}
return NULL;// 若比较到源串的最后,则一定没有匹配成功。
}
//定义函数 findLast()
- 5 -(共 22 页)
评论0