【试题三】阅读下列说明和 C 函数,填补 C 函数中的空缺,将解答填入答案纸的对应栏目内。【说明】字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下:Typedef struct ﹛char*str //字符串存储空间的起始地址int length //字符串长int capacity //存储空间的容量﹜SString;【函数 1 说明】函数 indexStr(S,T,pos)的功能是:在 S 所表示

题目
【试题三】阅读下列说明和 C 函数,填补 C 函数中的空缺,将解答填入答案纸的对应栏目内。【说明】字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下:Typedef struct ﹛char*str //字符串存储空间的起始地址int length //字符串长int capacity //存储空间的容量﹜SString;【函数 1 说明】函数 indexStr(S,T,pos)的功能是:在 S 所表示的字符串中,从下标 pos 开始查找 T 所表示字符串首次出现的位置。方法是:第一趟从 S 中下标为 pos、T 中下标伟 0 的字符开始,从左往右逐个对于来比较 S 和 T 的字符,直到遇到不同的字符或者到达 T 的末尾。若到达 T 的末尾,则本趟匹配的起始下标 pos 为 T 出现的位置,结束查找;若遇到了不同的字符,则本趟匹配失效。下一趟从 S 中下标 pos+1 处的字符开始,重复以上过程。若在 S 中找到 T,则返回其首次出现的位置,否则返回-1。例如,若 S 中的字符串伟″students ents″,T 中的字符串伟″ent″,pos=0,则 T 在 S 中首次出现的位置为 4。【C 函数 1】int indexStr(SString S ,SString T,int pos)﹛int i,j:if(S.length<1||S.lengthleght<1||T.length<1||S->lengthlength;i++) //通过覆盖来删除自串 TS->str[()]=S->str[i];S->length=(); //更新 S所表示串的长度﹜﹜


相似考题
更多“【试题三】阅读下列说明和 C 函数,填补 C 函数中的空缺,将解答填入答案纸的对应栏目内。【说明】字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下:Typedef struct ﹛char*str //字符串存储空间的起始地址int length //字符串长int capacity //存”相关问题
  • 第1题:

    阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。

    【函数2.1说明】

    函数palindrome(char s[])的功能是,判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,称该字符串是回文字符串,例如:“LEVEL”是回文字符串,而“LEVAL”不是。

    【函数2.1】

    int palindrome( char s[ ] )

    { char * pi, * pj;

    pi=s; pj=s+strlen(s)-1;

    while( pi<pj&&(1)){

    pi ++ ;pj --

    }

    if((2))return -1;

    else return 0;

    }

    【函数2.2说明】

    函数f(char * str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。

    例如若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出3个子字符串,分别为“12”、“4”和“5”。

    【函数2.2】

    void f( char * str, char del)

    { int i ,j ,len;

    len = strlen (str)

    i=0;

    while(i < len) {

    while((3))i++; /*忽略连续的标志字符*/

    /*寻找从str[i]开始直到标志字符出现的一个子字符串*/

    j=i+1;

    while(str[j] != del && str[j] ! = '\0')j ++

    (4): '\0'; /*给找到的字符序列置字符串结束标志*/

    printf("%s\t",&str[i]);

    (5);

    }

    }


    正确答案:(1)*pi==*pj (2)pipj或者等价表达式 (3)str[i]==del (4)str[j] (5)i=j+1
    (1)*pi==*pj (2)pipj或者等价表达式 (3)str[i]==del (4)str[j] (5)i=j+1 解析:(1)指针pi从左往右移动,指针pj从右往左移动,每移动一次,判断二者指向的元素是否相等,所以此处应填入判断语句*pi= =*pj。(2)pi如果能移动到pj右面,说明字符串是回文字符串,否则返回-1,所以此处应填入pipj或者其他等价表达式。(3)此处表达式判断当前字符是否等于标志字符del,即填入str[i]==del。(4)此处表达式为符合要求的字符串置结束标志,此时j已指向最后,所以应填入str[j]即可。(5)此处语句是修改i指针进行下一次循环,所以应填入i=j+1。

  • 第2题:

    假定输入的字符串中只包含字母和*号。请编写函数proc,它的功能是:将字符串中的前导*号全部删除,中间和后面的*号不删除。

    例如,若字符串中的内容为****a*bc*def*g** **,删除后,字符串中的内容则应当是a*bc*def*g** **。

    注意:部分源程序给出如下。

    请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括号中填入所编写的若干语句。

    试题程序:

    include<stdio.h=:{>

    include<conio.h>

    woid proc(char*st r)

    {

    }

    void main

    char str[81];

    printf("Enter a string:\n");

    gets(str);

    proc(str):

    printf("The string after deleted:\n");

    puts(str);}


    正确答案:

    void proc(char*str)

    {

    char*p=str

    while(*p=='*')p++;//通过P的移动来达

    到使P指向第一个不是*号的字符

    for(*p!='0 'p++str++)//把从第一个

    不是*号的字符放到a中 ‘

    *str=* P

    *str='0 '; //最后用'0'作为字符串结束标志

    }

    【解析】题目中要求将字符串中的前导*号全部删除首先将指针p移动到第一个不是*的字符,将指针P之后的字符放入原来的字符串中,并为新的字符串添加结束符。

  • 第3题:

    以下函数的返回结果是( )。

    int function(char *x) {char *p=x; while(*p++); return(p-x-1);}

    A、求字符串的长度

    B、将字符串x连接到字符串p后面

    C、将字符串x复制到字符串p中

    D、将字符串x反向存放


    参考答案A

  • 第4题:

    函数f_str(char *str,char del)的功能是;将非申字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。例如,若str的值为“66981636666257”,del的值为“6”,调用此函数后,将输出3个子字符串,分别为“981”、“3”和“257”。请将函数f_str中(6)~(8)空缺处的内容填写完整。

    [函数]

    void f_str(char *str,char del)

    { int i,j,len;

    len = strlen(str);

    i = 0;

    while (i<len) {

    while ( (6) )

    i++; /* 忽略连续的标志字符 */

    /* 寻找从srt[i]开始直到标志字符出现的一个子字符串 */

    j = i+1;

    while (str[j] !=del && str[j] !='\0')

    j++;

    (7)="\0"; /* 给找到的字符序列置字符串结束标志 */

    printf (" %s\t", & str [i]);

    (8);

    }

    }


    正确答案:函数f_str(char*strchar del)的功能是:将非空字符串str以分割标志字符为界线分割成若干个子字符串并输出。由函数说明和C代码可知该函数对给定的字符串进行从左至右的扫描找出不包含标志字符(变量del的值)的子字符串。在该函数C代码中变量i的初值为0len表示字符串的长度。当 ilen时进入循环体。如果当前字符(即str[i]的值)是标志字符则不做处理继续扫描以处理标志字符连成一串的情况。因此(6)空缺处所填写的内容是“str[i]==del”或其等价形式。 当退出第2个while循环时当前字符str[i]不是标志字符此时从str[i]开始继续寻找直到标志字符出现的…个子字符串(变量i保持不变用j标记寻找的过程)给找到的字符序列置字符串结束标志以便于后面语句的输出。因此(7)空缺处所填写的内容是“str[j]”。 printf输出语句结束之后就要继续寻找后面不包含标志字符的子字符串。此时需要把数组指针i移至j的后面再继续扫描。因此(8)空缺处所填写的内容是“i=j+1”。
    函数f_str(char*str,char del)的功能是:将非空字符串str以分割标志字符为界线,分割成若干个子字符串并输出。由函数说明和C代码可知,该函数对给定的字符串进行从左至右的扫描,找出不包含标志字符(变量del的值)的子字符串。在该函数C代码中,变量i的初值为0,len表示字符串的长度。当 ilen时进入循环体。如果当前字符(即str[i]的值)是标志字符,则不做处理,继续扫描以处理标志字符连成一串的情况。因此(6)空缺处所填写的内容是“str[i]==del”或其等价形式。 当退出第2个while循环时,当前字符str[i]不是标志字符,此时从str[i]开始继续寻找,直到标志字符出现的…个子字符串(变量i保持不变,用j标记寻找的过程),给找到的字符序列置字符串结束标志,以便于后面语句的输出。因此(7)空缺处所填写的内容是“str[j]”。 printf输出语句结束之后,就要继续寻找后面不包含标志字符的子字符串。此时,需要把数组指针i移至j的后面,再继续扫描。因此(8)空缺处所填写的内容是“i=j+1”。

  • 第5题:

    阅读下列程序说明和C代码,将应填入(n)处。

    请补充函数fun(),该函数的功能是:只保留字符串中的大写字母,删除其他字符,结果仍保存在原来的字符串中,由全局变量m对删除后字符串的长度进行保存。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

    试题程序:

    include<stdio.h>

    include<conio.h>

    int m;

    void fun(char*s)

    {

    int i=0,j=0;

    char *p=s;

    while(*(p+i))

    {

    if(*(p+i)>='A'&&*(p+i)<='Z')

    {

    (1);

    }

    (2);

    }

    s[j]='\0';

    (3);

    }

    main()

    {

    char str[80];

    clrscr();

    printf("\nEnter a string:");

    gets(str);

    printf("\n\nThe string is:\%s\n",str);

    fun(str);

    printf("\n\nThe string of changing is: \%s\n",str);

    printf("\n\nThe length of changed strtng is:\%d\n",m);

    }


    正确答案:(1)s[j++]=*(p+i)(2)i++(3)m=j
    (1)s[j++]=*(p+i)(2)i++(3)m=j 解析:填空1:将大写字母存于原字符串中,数组下标j自加1,为下一次存放做准备。填空2:为了判断字符串中的下一个字符是否为大写字母,变量i自加1。填空3:最后将大写字母的个数,即删除后字符串的长度赋给全局变量m。

  • 第6题:

    下面函数的功能是 char*fun(char*strl,char*str2) { while((*strl)&&(*str2++=*strl++)); return str2;}

    A.求字符串的长度

    B.比较两个字符串的大小

    C.将字符串str1复制到字符串str2中

    D.将字符串str1接续到字符串str2中


    正确答案:C
    解析:while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体,while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。本题中逻辑与符号连接的表达式值为真,*str2++=*strl++语句是将strl的内容逐个复制到str2字符串。

  • 第7题:

    有以下函数 int fun(char*X,char*y) { int n=0; while((*x= = =*y)*x!=\O){x++; y++; n++;} return n; } 函数的功能是( )。

    A.查找X和y所指字符串中是否有\o

    B.统计x和Y所指字符串中最前面连续相同的字符个数

    C.将Y所指字符串赋给X所指定存储空间

    D.统计X和Y所指字符串中相同的字符个数


    正确答案:B
    由题中while(*x==*y*x!=\n)可知此函数是统计x和y所指向的字符串中最前面的联系相同的字符的个数。

  • 第8题:

    阅读下列说明和C函数,填补C函数中的空缺,将解答填入答案纸的对应栏目内。 【说明】 字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。 设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下: typedef struct ﹛ Char *str; //字符串存储空间的起始地址 int length; //字符串长 int capacity; //存储空间的容量 ﹜SString;

    【函数1说明】 函数indexStr(S,T,pos)的功能是:在S 所表示的字符串中,从下标pos开始查找T所表示字符串首次出现的位置。方法是:第一趟从S中下标为pos、T中下标伟0的字符开始,从左往右逐个对于来比较S和T的字符,直到遇到不同的字符或者到达T的末尾。若到达T的末尾,则本趟匹配的起始下标pos为T出现的位置,结束查找;若遇到了不同的字符,则本趟匹配失效。下一趟从S中下标pos+1处的字符开始,重复以上过程。若在S中找到T,则返回其首次出现的位置,否则返回-1。 例如,若S中的字符为伟”students ents”,T中的字符串伟”ent",pos=0,则T在S中首次出现的位置为4。 【C函数1】 int index Str(SString S ,SString T,int pos) ﹛ int i,j: i (S.length<1||T.length<1||pos+T.length-1) return-1; for(i=pos,j=0;i<S.length &&j<T.length;)﹛ if (S.str[i]==T.str[j])﹛ i++;j++; ﹜ else﹛ i=( 1 );j=0 ﹜ ﹜ if ( 2 )return i -T.length; return-1; ﹜ 【函数2说明】 函数 eraseStr(S,T}的功能是删除字符串S中所有与T相同的子串,其处理过程为: 首先从字符串 S 的第一个字符(下标为0)开始查找子串T,若找到〈得到子串在S中的起始位置),则将串 S 中子串T之后的所有字符向前移动,将子串T覆盖,从而将其删除,然后重新开始查找下一个子串T,若找到就用后面的宇符序列进行覆盖,重复上述过程,直到将S中所有的子串T删除。 例如,若字符串 S为 “12ab345abab678”、T为“ab”。第一次找到“ab”时(位置为2),将“345abab678”前移,S 中的串改为“12345abab678” ,第二次找到“ab”时(位置为 5);将“ab678”前移,S中的串改为“12345ab678”,第三次找到“ab”时(位置为5);将“678”前移 ,S中的串改为“12345678 ”。 【C函数2】 Void eraseStr(SString*S,SStringT) ﹛ int i; int pos; if (S->length<1||T.length<1||S->length<T.length) return; Pos=0; for(;;)﹛ //调用indexStr在S所表示串的pos开始查找T的位置 Pos=indexStr( 3 ); if(pos=-1) //S所表示串中不存在子串T return; for(i=pos+T.length;i<S->length;i++) //通过覆盖来删除自串T S->str[( 4 )]=S->str[i]; S->length=( 5 ); //更新S所表示串的长度 ﹜ ﹜


    正确答案:
    (1)i+1
    (2)j==T.length
    (3)S,T,pos
    (4)i-T.length
    (5)S ->length -T.length

  • 第9题:

    阅读以下说明和 C 函数,填补函数代码中的空缺,将解答填入答题纸的对应栏内。 【说明 1】 函数 f(double eps) 的功能是:利用公式计算并返回 π 的近似值。【说明 2】 函数fun(char *str)的功能是:自左至右顺序取出非空字符串 str中的数字字符,形成一个十进制整数(最多 8 位)。例如,若 str中的字符串为 "iyt?67kp f3g8d5.j4ia2e3p12", 则函数返回值为 67385423。


    正确答案:(1)n+2
    (2)-s 或-1*s
    (3) *p!= ' \ 0'或等价形式
    (4) num*10 或等价形式
    (5) p++或等价形式

  • 第10题:

    试题29

    有以下函数

    int fun(char *x, char *y)

    { int n=0;

    while ((*x==*y)&&*x!=’\0’) {x++; y++; n++;}

    return n;

    }

    函数的功能是()

    A.查找x和y所指字符串中是否有’\n’

    B.统计x和y所指字符串中最前面连续相同的字符个数

    C.将y所指字符串赋给x所指存储空间

    D.统计x和y所指字符串中相同的字符个数


    正确答案:B
    试题29分析
    while ((*x==*y)&&*x!=’\0’)    {x++; y++; n++;}的意思为如果x和y所指向的单元的内容相等且x所指单元的字符串没有结束,x,y和n均向后移一位,然后继续判断。即统计x和y所指字符串中最前面连续相同的字符个数。
    试题29答案
    B

  • 第11题:

    阅读以下说明和C函数,填补代码中的空缺,将解答填入答题纸的对应栏内。
    [说明]
    函数removeDuplicates(chai *str)的功能是移除给定字符串中的重复字符,使每种字符仅保留一个,其方法是:对原字符串逐个字符进行扫描,遇到重复出现的字符时,设置标志,并将其后的非重复字符前移。例如,若str指向的字符串为"aaabbbbscbsss",则函数运行后该字符串为"absc"。

    [C代码] voidremoveDuplicates(char *str) { inti,len=strlen(str); /*求字符串长度*/ if(______)return; /*空串或长度为1的字符串无需处理*/ for(i=0;i<len;i++){ int flag=0; /*字符是否重复标志*/ int m; for(m=______; m<len;m++){ if(Str[i]==str[m]){ ______; break; } } if (flag) { int n,idx=m; /*将字符串第idx字符之后、与str[i]不同的字符向前移*/ for(n=idx+1; n<len; n++) if(Str[n]!=str[i]){ str[idx]=str[n];______; } str[______]='\0'; /*设置字符串结束标志*/ } } }


    答案:
    解析:
    len<2 或len<=1 或等价表示
    i+1 或等价表示
    flag=1 或给flag赋值为任何一个不是0的值
    idx++ 或idx=idx+1 或等价表示
    idx 或等价表示

  • 第12题:

    问答题
    规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:使字符串中尾部的*号不多于n个若多于n个,则删除多余的*号;若少于或等于n个,则不做任何操作,字符串中间和前面的*号不删除。例如,字符串中的内容为“****A*BC*DEF*G*******”,若n的值为4,删除后,字符串中的内容应;“****A*BC*DEF*G****”;若n的值为7,则字符串中的内容仍为“****A*BC*DEF*G*******”。n的值在:函数中输入。编写函数时,不得使用C语言提供的字符串函数。  注意:部分源程序给出如下。  请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include void fun(char *a,int n){}main(){ char s[81]; int n; printf(Enter a string:); gets(s); printf(Enter n:); scanf(%d,&n); fun(s,n); printf(The string after deleted:); puts(s);}

    正确答案:

    void fun(char *a,int n)
    {
    int i=0,k=0;
    char *p,*t;
    p=t=a;
    while(*t)
    t++;
    t--;
    while(*t=='*')
    {
    k++;
    t--;
    }
    if(k>n)
    {
    while(*p&&p<t+n+1)
    {
    a[i]=*p;
    i++;
    p++;
    }
    a[i]='\0';
    }
    }
    解析: 通过第一个while循环统计出字符串的有效长度,不包括最后的结束符;第二个while循环统计字符串尾部*号的个数,循环结束时,k值记录了原字符串结尾星号的数目,t指向字符串中最后一个不为星号的字符的下标。然后通过if语句比较尾部*号数是否多于n个,若大于则保留n个*号和其余字符,总共需要保留的字符数是t+n+1,1是指最后的结束符。

  • 第13题:

    编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为asd asasdfg asd as zx67 asd mklo,子字符串为as,则应当输出6。

    注意:部分源程序给出如下。

    请勿改动主函数main和具他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <conio.h>

    include <stdio.h>

    include <string.h>

    int fun(char *str, char *substr)

    {

    }

    main ( )

    {

    char str[81],substr[3];

    int n;

    clrscr ();

    printf ("输入主字符串 ");

    gets (str);

    printf ("输入子字符串");

    gets (substr);

    puts (str);

    puts (substr);

    n=fun (shr, substr);

    printf("n=%d\n ",n);

    }


    正确答案:int fun(char *str char *substr) { int i j=0; for(i=0;str[i+1]!='\0';i++) /*如果一个长度为2的子字符串在主字符串中出现一次则j+1 如此 循环*/ if (str [i]==substr [0] &&str [i+1]==substr [1] ) j++; return j; /*返回子字符串在主字符串中出现的次数*/ }
    int fun(char *str, char *substr) { int i, j=0; for(i=0;str[i+1]!='\0';i++) /*如果一个长度为2的子字符串在主字符串中出现一次,则j+1, 如此 循环*/ if (str [i]==substr [0] &&str [i+1]==substr [1] ) j++; return j; /*返回子字符串在主字符串中出现的次数*/ } 解析:该题中subsu只有两个字符,所以可以用if语句来直接进行判断。要注意if())中str组的下标为i和i+1,即比较当前字符及其以后的一个字符是否分别与substr中的字符对应相同,若都相同则表示出现了一次。

  • 第14题:

    假定输人的字符串中只包含字母和*号。请编写函数proc,它的功能是:将字符串中 的前导*号全部删除,中间和后面的*号不删除。 例如,若字符串中的内容为****a*bc*def*g****,删除后,字符串中的内容则 应当是a*bc*def*g****。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括号中填入所编 写的若干语句。 试题程序: include<stdio.h> include<conio.h> void proc(char*str) { } void main { char str[81]; printf("Enter a string:kn"); gets(str); proc(str); printf("The string after deleted:kn"); puts(str);}


    正确答案:
    void proc(char * str)
    {
    char*p=str;
    while(* p= =*)p++;//通过p的移动来达到使p指向第一个不是*号的字符
    for(;* p!=\0;p++,str++)//把从第一个不是*号的字符放到a中
    * str=* P:
    * str=\0;//最后用\0作为字符串结束标志
    }
    【解析】题目中要求将字符串中的前导*号全部删除,首先将指针P移动到第一个不是*的字符,将指针P之后的字符放入原来的字符串中,并为新的字符串添加结束符。

  • 第15题:

    编写算法,实现下面函数的功能。函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)


    参考答案:本题是字符串的插入问题,要求在字符串s的pos位置,插入字符串t。首先应查找字符串s的pos位置,将第pos个字符到字符串s尾的子串向后移动字符串t的长度,然后将字符串t复制到字符串s的第pos位置后。
      对插入位置pos要验证其合法性,小于1或大于串s的长度均为非法,因题目假设给字符串s的空间足够大,故对插入不必判溢出。
      [算法描述]
      void insert(char *s,char *t,int pos)
      //将字符串t插入字符串s的第pos个位置。
      {int i=1,x=0; char *p=s,*q=t; //p,q分别为字符串s和t的工作指针
      if(pos<1) {cout<<“pos参数位置非法”<  while(*p!=’\0’&&i  //若pos小于串s长度,则查到pos位置时,i=pos。
      if(*p == '/0') { cout<  else //查找字符串的尾
      while(*p!= '/0') {p++; i++;} //查到尾时,i为字符‘\0’的下标,p也指向‘\0’。
      while(*q!= '\0') {q++; x++; } //查找字符串t的长度x,循环结束时q指向'\0'。
      for(j=i;j>=pos ;j--){*(p+x)=*p; p--;}//串s的pos后的子串右移,空出串t的位置。
      q--; //指针q回退到串t的最后一个字符
      for(j=1;j<=x;j++) *p--=*q--; //将t串插入到s的pos位置上
      [算法讨论] 串s的结束标记('\0')也后移了,而串t的结尾标记不应插入到s中。

  • 第16题:

    阅读下列函数说明和C函数,将应填入______处的语句写在答题纸的对应栏内。

    [函数2.1说明]

    函数palindrome(char s[])的功能是:判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样,称该字符串是回文字符串,例如,“LEVEL”是回文字符串,而“LEVAL”不是。

    [函数2.1]

    int palindrome(char s[])

    {

    char *pi, *pj;

    pi=s;pj=s+strlen(s)-1;

    while(pi<pj&& (1) ) {

    pi++;pj--;

    }

    if( (2) ) return-1;

    else return 0;

    }

    [函数2.2说明]

    函数f(char *str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。

    例如,若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出3个子字符串,分别为“12”,“4”和“5”。

    [函数2.2]

    void f(char *str,char del)

    {

    int i,j,len;

    len=strlen(str);

    i=0;

    While(i<len){

    While( (3) )i++; /* 忽略连续的标志字符 */

    /* 寻找从str[i]开始直到标志字符出现的一个子字符串 */

    j=i+1;

    while(str[j]!=del &&str[j]!'\0')j++;

    (4) ='\0'; /* 给找到的字符序列置字符串结束标志 */

    printf("%s\t",&str[i]);

    (5);

    }

    }


    正确答案:(1)*pi==*pj (2)pipj或 *pi != * pj及其等价形式 (3)str[i]==del (4)str[j] (5)i=j+1
    (1)*pi==*pj (2)pipj或 *pi != * pj,及其等价形式 (3)str[i]==del (4)str[j] (5)i=j+1 解析:[函数2.1]
    若一个字符串顺读和倒读都一样,称该字符串是回文字符串。如果使用数组s[n]来存储一个字符串,则根据这个定义,要判断一个串是否是回文字符串,需要循环比较:
    (1)该字符串的第一个元素s[0]和最后一个元素s[n-1]比较,如果s[0]不等于 s[n-1],则s不是回文字符串。
    (2)如果s[0]等于s[n-1],则第二个元素s[1]和倒数第二个元素s[n-2]比较,如果s[1]不等于s[n-2],则s不是回文字符串。
    (3)依次类推,直到最中间的2个元素也比较完毕(如果s有偶数个元素),或者只剩下中间的1个元素(如果s有奇数个元素)。
    当上述循环结束时,如果最中间的元素没有进行比较,就说明s不是回文字符串,如果进行了比较,则s是回文字符串。
    在函数2.1中,pi和pj是2个指向字符的指针,程序首先将s的首地址赋给pi(即 pi=&a[0]),将元素s[strlen(s)-1)的地址赋给pj(即pj=&s[strlen(s)-1]),当pipj并且pi和pj所指向的字符相等时进行循环:pi自增,pj自减。
    退出循环后,如果pipj,则s是回文字符串(如果s有偶数个元素,则为pi>pj,如果 s有奇数个元素,则为pi=pj);如果pipj,则s不是回文字符串。
    [函数2.2]
    由函数2.2说明可知,此函数对给定的字符串进行从左至右的扫描,找出不包含标志字符的子字符串。
    在函数2.2中,i的初值为0,len表示字符串的长度。当ilen时进行循环:如果当前字符是标志字符,则不做处理,继续扫描以处理标志字符连成一串的情况。当退出该循环时,当前字符str[i]不是标志字符,这时开始寻找从str[i]开始,直到标志字符出现的一个子字符串(i保持不变,用j标记寻找的过程),给找到的字符序列置字符串结束标志,以便于后面语句的输出。
    输出语句结束后,就要继续寻找后面的不包含标志字符的子字符串,这时需要把指针 i移动j的后面,继续扫描。

  • 第17题:

    以下函数fun的功能是返回str所指字符串中以形参c中字符开头的后续字符串的首地址,例如,str所指字符串为Hello!,c中的字符为e,则函数返回字符串ello!的首地址。若str所指字符串为空或不包含c中的字符,则函数返回NULL,请填空。char *fun(char *str,char c){ int n=0; char *p=str; if(p!=NULL) while(p[n]!=c&&p[n]!=’\0’) n++; if(p[n]==’\0’) return NULL; return();}


    正确答案:p+n
    在本题中,函数fun的功能是返回str所指字符串中以形参c中字符开头的后续字符串的首地址。
    在本题的程序中,fun函数带有两个形参,其中一个是指针str,它指向字符串的首地址,另一个是字符变量c。程序首先定义了一个整型变量n,从程序中可知,它是字符串str中参数c相对于首地址的偏移量,然后定义了一个指针变量p,指向字符串str的首地址,然后执行条件语句,如果字符串不为空,则执行循环语句,循环结束的条件是要么字符串结束,要么找到形参c中对应的字符。根据循环结束的条件我们可以判断,其非死循环,循环结束后,从程序中可以看出,判断循环结束的原因是否因为字符串结束而结束的,如果是,说明没找到形参c中对应的字符,返回NULL。
    如果不是,则说明是因为找到了形参c中对应的字符而结束循环的。根据题目要求,需要返回以形参c中字符开头的后续字符串的首地址,而这时以形参c中字符开头的后续字符串的首地址为p+n。

  • 第18题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    【函数1说明】

    函数palindrome(char s[])的功能是:判断字符串s是否为回文字符串。若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,则可称该字符串是回文字符串。例如,“LEVEL”是回文字符串,而“LEVAL”不是。

    【函数1】

    int palindrome(char s[]{

    char *pi, *pj;

    pi=s; pj=s+strlen(s)-1;

    while(pi<pj&&(1)){

    pi++; pj--;

    }

    if((2))return-1;

    else return 0;

    }

    【函数2说明】

    函数f(char *str, char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。

    例如,若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出三个子字符串,分别为“12”、“4”和“5”。

    【函数2】

    void f(char *str, char del){

    int i,j, len;

    len=strlen(str);

    i=0;

    while(i<len){

    While((3)) i++; /*忽略连续的标志字符*/

    /*寻找从str[i]开始直到标志字符出现的一个子字符串*/

    j=i+1;

    while(str[j]!=del && str[j]!='\0')j++;

    (4)='\0'; /*给找到的字符序列置字符串结束标志*/

    printf("%s\t",&str[i]);

    (5);

    }

    }


    正确答案:(1)*pi==*pi (2)pipj或*pi!=*pj (3)str[i]==del (4)str[j] (5)i=j+1
    (1)*pi==*pi (2)pipj或*pi!=*pj (3)str[i]==del (4)str[j] (5)i=j+1 解析:本题考查在C语言中对字符串的处理。
    【函数1】
    使用数组s[n]来存储一个字符串,因为要根据回文字符串的定义来判断一个串是否是回文字符串,所以需要循环比较。
    (1)拿该字符串的第一个元素s[0]和最后一个元素s[n-1]比较,如果s[0]不等于s[n-1],则s不是回文字符串。
    (2)如果s[0]等于s[n-1],则拿第二个元素s[1]和倒数第二个元素s[n-2]比较,如果 s[1]不等于s[n-2],则s不是回文字符串。
    (3)依次类推,直到最中间的两个元素也比较完毕(如果s有偶数个元素),或者只剩下中间的一个元素(如果s有奇数个元素)。
    当上述循环结束时,如果最中间的元素没有进行比较,就说明s不是回文字符串;如果进行了比较,则s是回文字符串。
    在函数1中,pi和pj是两个指向字符的指针,程序首先将s的首地址赋给pi(即*pi =a[0]),将元素s[strlen(s)-1]的地址赋给pj(即*pj=s[strlen(s)-1]),当pipj并且pi和pj所指向的值相等时进行循环:pi自增,pj自减。
    退出循环后,如果pipj,则s是回文字符串(如果s有偶数个元素,则为pi>pj;如果s有奇数个元素,则为pi=pj);如果pipj,则s不是回文字符串。
    【函数2】
    由函数2说明可知,此函数对给定的字符串进行从左至右的扫描,找出不包含标志字符的子字符串。
    在函数2中,i的初值为0,len表示字符串的长度。当ilen时进行循环:如果当前字符是标志字符,则不作处理,继续扫描。当退出该循环时,当前字符str[i]不是标志字符,这时从str[i]开始寻找,直到找到在标志字符中出现的一个子字符串(i保持不变,用i标记寻找的过程),给找到的字符序列置字符串结束标志,以便于后面语句的输出。
    输出语句结束后,就要继续寻找后面的不包含标志字符的子字符串,这时,需要把指针i移动至j的后面,继续扫描。

  • 第19题:

    请补充fun()函数,该函数的功能是:把字符的ASCII码中为奇数的字符从字符串str中删除,结果仍然保存在字符串str中,字符串str从键盘输人,其长度作为参数传人fun()函数。

    例如,输入“abcdef”,则输出“bdf”。

    注意:部分源程序给出如下。

    请勿改动main()函数和其他函数中的任何内容,仅在mare()函数的横线上填入所编写的若干表达式或语句。

    试题程序:


    正确答案:


    【解析】先判断ASCⅡ码的奇偶。
    第一空:根据主函数“fun(str,len);”调用语句,其中len为字符串str的长度,用来控制循环。根据主函数中对应的调用语句,补全fun()函数定义,第一空填“fun(chars[],intn)”。
    第二空:“s[j++]=s[i];”语句中j的变量在使用前要对其取值进行初始化,因为数组下标是由0开始的,初始化值为0,所以第二空填“j-0”。
    第三空:新生成的字符串要加尾符标志,所以第三空填“s[j]=ˊ\0ˊ”。

  • 第20题:

    下面函数的功能是 ( ) int funl(char * X) { char * y=X; whar(* y + + ); return (y - x - 1);}

    A.求字符串的长度

    B.比较两个字符串的大小

    C.将字符串x复制到字符串y中

    D.将字符串x连接到字符串y后面


    正确答案:A

  • 第21题:

    阅读以下说明和C函数,填补代码中的空缺(1)~(5),将解答填入答题纸的对

    应栏内。

    【说明】

    函数removeDuplicates(char *str)的功能是移除给定字符串中的重复字符,使每种字

    符仅保留一个,其方法是:对原字符串逐个字符进行扫描,遇到重复出现的字符时,设

    置标志,并将其后的非重复字符前移。例如,若str指向的字符串为“aaabbbbscbsss”,

    则函数运行后该字符串为“abse”。

    【c代码】

    void removeDuplicates (char *str)

    int i,len = strlen (str); /*求字符串长度*/

    If( (l) )return;/*空串或长度为1的字符串无需处理*l

    for(i=0;i<len;i++) {

    Int flag =O; /*字符是否重复标志*/

    int m:

    for(m =( 2 ); m<len; m++){

    if(str[i]==str[m] ) {

    __(3)_;break;

    }

    }

    if (flag){

    Int n,idx = m;

    /*字符串第idx字符之后、与str [i]不同的字符向前移*/

    For( n=idx+l; n<len. n++)

    if ( str[n]!= str[i]) {

    str[idx]= str[n]; (4);

    }

    Str[(5)]=\0; /* 设置字符串结束标志*/

    }

    }

    }


    正确答案:
    本题考查C语言基本应用。题目要求在阅读理解代码说明的前提下完善代码。字符串的运算处理是c程序中常见的基本应用。根据注释,空(1)处应填入的内容很明确,为“len=1”或其等价表示。要消除字符串中的重复字符,需要扫描字符串,这通过下面的代码来实现:For(i=0;ilen;i++){intflag=Oj;/*字符是否重复标志*/intm:for(m=(2);m<len;m++)(if(str[i]==str[m]{(3),break;}*}......上面代码中.循环变量i用于顺序地记下字符串中每个不同字符首次出现的位置,那么后面的处理就是从i的下一个位置开始,考查后面的字符中有没有与它相同的(str[i]=sir[m]),因此空(2)应填入“i+l”或其等价表示。显然,当发现了重复字符时,应设置标志,空(3)处应填入“flag=l”或者给flag赋值为任何一个不是0的值。根据说明,发现与str[i]相同的第一个字符str[m]后,需要将其后所有与str[i]不同的字符前移,以覆盖重复字符str[m],对应的代码如下;if(flag){intn,idx=m;/*将字符串第idx字符之后、与str[1]不同的字符向前移*/for(n=idx+l,n<len.n++)if(str[n]!=str[i]}{str[idx]=str[n];(4)}Str[(5)]=’\0’;/*设置字符串结束标志*/}初始时,idx等于m,使str[n]覆盖str[idx]后,需要将idx自增,以便将后面与str[i]不同的字符继续前移,因此空(4)处应填入“idx++”或等价表示。由于后面字符前移了,所以字符串结束标志也需重新设置,空(5)处应填入“idx”。试题二参考答案(1)len2或len=l或等价表示(2)i+1或等价表示(3)flag=l或给flag赋值为任何一个不是O的值(4)idx++或idx=idx+l或等价表示(5)idx或等价表示

  • 第22题:

    阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。【说明1】
    函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。【C函数】
    void deldigit(char *s)
    {
    char *t = (char *)malloc( (1) ); /*申请串空间*/
    int i, k = 0;

    if (!t) return;
    for(i = 0; i < strlen(s); i++)
    if ( !(*(s+i)>=’0’ && *(s+i)<=’9’) ) {
    t[k++] = (2) ;
    }
    (3) = ’\0’; /*设置串结束标志*/
    strcpy(s,t);
    free(t);
    }
    【说明2】
    函数reverse(char *s, int len)的功能是用递归方式逆置长度为len的字符串s。例如,若串s的内容为“abcd”,则逆置后其内容变为“dcba”。
    【C函数】
    void reverse(char *s, int len)
    {
    char ch;
    if ( (4) )
    {
    ch = *s;
    *s = *(s+len-1);
    *(s+len-1) = ch;
    reverse( (5) );
    }
    }


    答案:
    解析:
    (1)strlen(s)+1
    (2)*(s+i),或s[i]或其等价表示
    (3)*(t+k)或t[k] 或其等价表示
    (4)len>1 或len>=1 或其等价表示
    (5)s+1 len-2根据说明1,在函数deldigit(char*s)中需先申请一个与s等长的临时字符串空间并令t指向它,因此空(1)处应填入“strlen(s)+1”,其中,加1的原因是函数strlen计算s所指向字符串的长度时,没有包含串结束标志字符“\0”。当然,申请比“strlen(s)+1”更大的存储区也可以,只是没有必要。
    由于需要将非数字字符按原来的顺序存入t所指向的存储区,所以空(2)处填入“s[i]”,或其等价表示形式。
    最后在设置t所指向字符串的结束标志,即令t[k]=’\0’.在这里,空(3)处的t[k]写为t[k++]也可以,而写为t[k+1]或t[++k]则不符合整个代码的处理逻辑。
    函数reverse(char*s,int len)的功能是用递归方式逆置长度为len的字符串s,其中以下代码实现了将s所指字符与串中最后一个字符交换的处理。
    Ch=*s; *s=*(s+len-1); *(s+len-1)=ch;

  • 第23题:

    单选题
    有以下函数:int fun(char *s,char *t){ while((*s)&&(*t)&&(*t++==*s++)); return (*s-*t);}函数的功能是(  )。
    A

    求字符串的长度

    B

    比较两个字符串的大小

    C

    将字符串s复制到字符串t中

    D

    连接字符串s和字符串t


    正确答案: C
    解析:
    函数体执行过程为:将两个字符串首地址传入函数,分别赋给指针s与t,在函数体内s与t所指向的字符串的字符不为'\0'时,判断两个指针指向的字符是否相同,若相同则两个指针分别加一指向下一个字符,若不同则退出while循环,返回不相同的字符的ASCII码值之差。返回值大于0表示字符串s>t;返回值小于0表示s<t;返回值为0,表示s=t。函数实现了比较两个字符串大小的功能。答案选择B选项。