第4章 字符串 课后习题

一、单项选择题

1. 以下程序段的结果是:c的值为( A)。

char *a[5] = {"12378", "1237", "1236789", "1237", "123708"};

int i, c = 0;

for (i = 0; i < 5; i++)

if (StrCmp(a[i], "1237") == 0) c++;

A. 2
B. 5
C. 0
D. 1237

2. 以下程序段的结果是:c的值为(B )。

char a[8] = "1236789", int *p = a, int c = 0;

while (*p++)c++;

A. 8
B. 7
C. 10
D. 12

3. 在C语言中,分别存储 "S" 和 's',各需要占用(D )字节


A. 一个和两个
B. 两个
C. 一个
D. 两个和一个

4. (A )是字符串 "abcd321ABCD" 的子串

A. "21ABC"
B. "abcABCD"
C. "abcD"
D. "321a"

5. 以下程序段的结果中,p指向( A)。

char a[] = "English"; 
char *p = a; 
int n = 0;
while (*p != '\0') { n++; p++; }

A. 字符串的结束符
B. a
C. 字符 h

D. 7

二、填空题

1.  字符串 a1 = "BEIJING", a2 = "BEI", a3 = "BEFANG", a4 = "BEFI" 中最大的是  a1  

2. 数组 a 经初始化,char a[] = "English"; a[7] 中存放的是   '\0'  

3. 函数 StrCmp("abA", "aba") 的值为  -1   

4. 设模式串 a1 = "aBc", a2 = "BCd", a3 = "ABC", a4 = "Abc",主串为 "ABcCDABcdEFaBc",能与主串成功匹配的模式串是  a1    

三、算法分析题

1. 下列程序用来判断字符串是否对称,若对称则返回 1,否则返回 0,如 f("abba") 返回 1,f("abab") 返回 0。完成程序中的空格,并说明理由。

int (char * s)

{

    int i = 0, j = 0;

    while (s[j])  j++    ;

    for (j --; i < j && s[i] ==  s[j]  ; i++, j --)

    return (i < j)  0:1   ;

}

2. 阅读下面的程序,做出简单分析,并说明其功能。

typedef struct

{

    char data[MaxSize];   /* 存储串的最大长度为 MaxSize */

    int len;              /* 串的实际长度 */

} SString;

int count(SString * subs, SString * s)

{

    int i = 0, j, k, count = 0;

    for (i = 0; s -> data[i]; i++)

    {

        for (j = i, k = 0; (s -> data[j] == subs -> data[k]); j++, k++);

        if (k == subs -> len - 1)

            count ++;

    }

    return(count);

}

答:

功能说明:统计子串 subs 在主串 s 中出现的总次数

四、计算题

1. 设模式串 t = "ABAABC",j 为 t 中字符的位置,利用 next 函数的定义,试求 t 中第 j 个字符的 next 函数值,填于表 4-1。

4-1  计算题 1

j 1 2 3 4 5 6
模式 (t) A B A A B C
next (j) 0 1 1 2 2 3

解析:

(1)根据next函数的定义:

        j=1时,next(j)=0

        j=2时,next(j)=1

(2)j=5时:

j 1 2 3 4 5 6
next (j) 0 1
j=5 A B A A B C

    子系列A等于子系列A,相等的子序列长度为1
   ●子系列(A,B)不等于子系列(A,A),相等的子序列长度为0
   ●子系列(A,B,A)不等于子系列(B,A,A),相等的子序列长度为0
   比较结束,最大相等的子序列长度为1
   next(5)=1+1=2

                  

(3)j=6时:

j 1 2 3 4 5 6
next (j) 0 1
j=6 A B A A B C
   ●子系列A不等于子系列B,相等的子序列长度为0
   ●子系列(A,B)等于子系列(A,B),相等的子序列长度为2
   ●子系列(A,B,A)不等于子系列(A,A,B),相等的子序列长度为0
   ●子系列(A,B,A,A)不等于子系列(B,A,A,B),相等的子序列长度为0
   比较结束,最大相等的子序列长度为2
   next(6)=2+1=3

                     

(4)j=4时:

j 1 2 3 4 5 6
next (j) 0 1
j=4 A B A A B C
   ●子系列A等于子系列A,相等的子序列长度为1
   ●子系列(A,B)不等于(B,A),相等的子序列长度为0
   比较结束,最大相等的子序列长度为1
   next(4)=1+1=2

(5)j=3时:

j 1 2 3 4 5 6
next (j) 0 1
j=3 A B A A B C
   ●子系列A等于子系列B,相等的子序列长度为0
   比较结束,最大相等的子序列长度为0
   next(3)=0+1=1

注:左边的子序列由第一个位置向右依次推进到 j-2 的位置结束(红色标记处);

        右边的子序列由 j-1 的位置向左依次推进。

        然后分别比较两个子序列是否相等,如果相等,则计算序列中元素的个数。

2. 设模式串 t = "BCBBC",j 为 t 中字符的位置,利用 next 函数值的递推算法求 t 中第 j 个字符的 next 函数值,填于表 4-2。

表 4-2  计算题 2 表

j 1 2 3 4 5
模式 (t) B C B B C
next (j) 0 1 1 2 2

Logo

一站式 AI 云服务平台

更多推荐