编写一个函数findStr(char*str,char*substr),该函数统计一个长度为2的子字符串substr在另一个字符串str中出现的次数,该次数作为函数值返回。例如,假定输入的字符串为”asd asasdfg asd as zx67 asdmklo”,子字符串为”as”,函数返回值是6。 函数ReadWrite实现从文件in.dat中读取两个字符串,并调用函数findStr,最后把结果输出到文件out.dat中。 注意:部分源程序存在test.c文件中。请勿改动主函数main和其他函数中的任何

题目

编写一个函数findStr(char*str,char*substr),该函数统计一个长度为2的子字符串substr在另一个字符串str中出现的次数,该次数作为函数值返回。例如,假定输入的字符串为”asd asasdfg asd as zx67 asdmklo”,子字符串为”as”,函数返回值是6。 函数ReadWrite实现从文件in.dat中读取两个字符串,并调用函数findStr,最后把结果输出到文件out.dat中。 注意:部分源程序存在test.c文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数findStr的花括号中 填入你编写的若干语句。


相似考题
更多“ 编写一个函数findStr(char*str,char*substr),该函数统计一个长度为2的子字符串substr在另一个字符串str中出现的次数,该次数作为函数值返回。例如,假定输入的字符串为”asd asa”相关问题
  • 第1题:

    编写一个函数findStr(),该函数统计一个长度为2的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为“as”,函数返回值是6。

    函数ReadWrite()的功能是实现从文件in40.dat中读取两个字符串,并调用函数findstr(),最后把结果输出到文件out40.dat中。

    注意:部分源程序已给出。

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

    include<stdio.h>

    include<string.h>

    include<conio.h>

    int findStr(char *str,char *substr)

    {

    main ( )

    {

    char str[81],substr[3];

    int n;

    clrscr();

    printf("输入原字符串: ");

    gets(str);

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

    gets(substr);

    puts(str);

    puts(substr);

    n=findStr(str,substr);

    printf("n=%dkn",n);

    ReadWrite();

    }

    ReadWrite()

    {

    char ch, str[81],substr[3];

    int n,len, i=0;

    FILE *rf,*wf;

    rf=fopen("in40.dat","r");

    wf=fopen("out40.dat","w");

    while(i<5)

    {

    fgets(str,80,rf);

    fgets(substr,10,rf);

    len=strlen(substr)-1;

    ch=substr[len];

    if(ch=='\n'||ch==Oxla)

    substr[len]=0;

    n=findStr(str,substr);

    fprintf(wf,"%dln",n);

    i++;

    }

    fclose(rf);

    fclose(wf);

    }


    正确答案:int findStr(char *strchar*substr) {int n; char *p*r; n=0; while(*str) { p=str; /*指针p指向字符串首地址*/ r=substr; /*指针r指向子字符串首地址*/ while(*r) if(*r==*p) /*如果子字符串的第一个字符等于字符串中的该字符则继续比较下一个字符*/ { r++; p++; } else break; /*否则退出循环*/ if(*r=='\0') /*如果子字符串在字符串中出现了一次*/ n++; /*则n加1进行统计*/ str++; /*指向字符串中的下一个字符*/ } return n; /*返回n*/ }
    int findStr(char *str,char*substr) {int n; char *p,*r; n=0; while(*str) { p=str; /*指针p指向字符串首地址*/ r=substr; /*指针r指向子字符串首地址*/ while(*r) if(*r==*p) /*如果子字符串的第一个字符等于字符串中的该字符,则继续比较下一个字符*/ { r++; p++; } else break; /*否则退出循环*/ if(*r=='\0') /*如果子字符串在字符串中出现了一次*/ n++; /*则n加1,进行统计*/ str++; /*指向字符串中的下一个字符*/ } return n; /*返回n*/ } 解析:本题考查的知识点如下:
    (1)指针的相关操作。
    (2)强行退出———break的使用。
    指针是C语言中的一个难点。在这里,我们要使用指针实现对数组的访问继而进行字符韵比较。使用数组存放字符串时,存放的字符个数要比数组的容量小1,因为数组最后一个位置存放的是空格或者结束标志位。我们可利用这一点来判断一个字符串是否已经结束。在循环结构中常常要出现强行退出的情况,这里要使用到bleak语句强行退出一层循环。当字符串中的某个字符与子字符串的第一个字符不同时,则将字符串中的下一个字符与子字符串中的第一个字符比较,而不是与子字符串中的第二个字符比较。

  • 第2题:

    以下函数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。

  • 第3题:

    下列给定程序中函数fun的功能是:统计substr所指的字符串在str所指的字符串中出现的次数。 例如,若字符串为aaas lkaaas,子字符串为as;则应输出2。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODll.C中,不得增行或删行,也不得更改的程序的结构!


    正确答案:
    【参考答案】

    【考点分析】
    本题考查:for循环语句的格式,for循环语句使用最为灵活,其一般形式为:for(表达式1;表达式2;表达式3),注意表达式之间使用”;”相隔;if条件语句的格式,其中if关键字需要区别大小写,这里不能混淆使用。关键字是由C语言规定的具有特定意义的字符串,也称为保留字。用户定义的标识符不应与关键字相同,并且关键字应小写。
    【解题思路】
    先看循环条件for(i=0,str[i],i++),不难发现此处for循环语句的格式有误,其中表达式之间应以”;”相隔;同时很容易发现if条件语句处的关键字书写错误。

  • 第4题:

    下列给定程序中,函数fun()的功能是:统计字符串substr在字符串srt中出现的次数。例如,若字符串为aaas 1 kaaas,子字符串为as,则应输出2。

    请改正程序中的错误,使它能得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include <stdio.h>

    fun (char *str, char *substr)

    {int i, j, k, num=0;

    /*************found**************/

    for (i=0, str [i], i++)

    for (j=i, k=O; substr [k]==str [ j ]; k++, j ++ )

    if (substr [k+l]==' \0')

    {num++;

    break;

    }

    return num;

    }

    main ( )

    { char str[80],substr[80];

    printf("Input a string: ");

    gets (str);

    printf("Input a sbustring: ");

    gets (substr);

    printf ("%d\n ", fun (str, substr) );


    正确答案:错误:for(i=0srt[i]i++) 正确:for(i=0;str[i];i++)
    错误:for(i=0,srt[i],i++) 正确:for(i=0;str[i];i++) 解析:从字符串s中找出子字符串的方法是:从第1个字符开始,对字符串进行遍历;若s串的当前字符等于t串的第1个字符,两字符串的指针自动加1,继续比较下一个字符;若比较至字符串的结尾,则跳出循环;若s串的字符和t串的字符不对应相同,则继续对s串的下一个字符进行处理。

  • 第5题:

    mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回,请填空。int mystrlen(char *str) { int i; for(i=0;;i++); return(i); }


    正确答案:*(str+i)!=‘\0’或*(str+i)
    在本题中,题目告诉我们,mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。要求取一个字符串的长度,其中最关键的因素是如何判断字符串是否结束,然后就可以用循环逐个字符进行计算,获得最后的字符串长度。
    在程序中,函数mystrlen带了一个指针类型的形参变量str,该指针变量指向字符串的起始位置,通过该指针完成对字符串的计算,接着定义一个整型变量i作为循环变量,在循环结构for语句中,给出了循环变量的初始值和循环变量值改变的方式,但缺少循环结束的判断条件,这就是该题需要完成的空。通过前面的分析我们知道,循环用来求取字符串的长度,如果循环结束,字符串中所有的字符应该都被取,即字符串结束,由于字符串结束的标识符是‘\0’,因此,循环结束的判断条件应该为所取的字符为结束标识符,因此,循环结束的判断条件应该为*(str+i)!=‘\0’。另外,又由于字符结束标识符对应的值为0,即为假,因此,可以用来作为循环结束的条件,因此,本题的答案可以为*(str+i)!=‘\0’或*(str+i)。