假定输入的字符串中只包含字母和*号。请编写函数 fun(),它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了字符串的K度,形参h给出了字符串中前导*号的个数,形参e给出了字符山中最后*号的个数。在编写函数时,不得使用c语言提供的字符串函数。 例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仪在函数fun的花括号中填入所编写的若干语句。 试题程序: #include <stdio.h> #include <conio.h> void fun (char *a;int n ,int h ,int e) { } main ( ) { char s [81],*t,*f; int m=0,tn=0, fn=0; printf("Enter a string :\n"); gets (s); t=f=s; while (*t) {t++;m++; } /*m为字符串的长度*/ t--; /*指针t指身字符串尾部*/ while (*t==’*’) {t--; tn++; } /*指针t指向最后一个字母,tn统计尾部’*’的个数*/ while (*f==’*’ ) {f++;fn++;} /*指针f指向第一个字母,tn统计导’*’的个数*/ fun( s, m, fn, tn); printf ("The string after deleted: \n"); puts (s); }
参考答案:
解析:void fun (char *a, int n ,int h , int e) { int i,j=0 for (i=h; i<n-e; i++) /*第一个字母和最后一个字母之间的字符全不删除*/ a[j++]=a[i]; a[j]=’\0; /*在字符串最后加上结束标记*/ } 注意循环变量i的初值(h)和终止值(n-e),由于h和e分别是a中的前导*和尾部*的个数,n是字符串的长度,所以从a[h])到a[n-e-1]之间的所有字符都要留下,而其他字符均删除。删除操作(即留下相应字符)现己由循环完成。 本题技巧部分: void fun(char *a, int n, int h, int e ) {a[n-e]=’\0; strcpy(a,a+h);} 另外,请注意,a(n-e]的作用是使最后一个字母后出现字符串结束符。木程序采用了strcpy()库函数。