假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内容应当是:ABCDEFG。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
文件PROG1.C内容如下:
#include<stdio.h>
void fun(char *a)
void main( )
char s[81];
printf("Enter a string: \n");gets(s);
fun(s);
printf("The string after deleted:\n");pats(s);
参考答案:void fun(char *a){
int i,j;
for(i=0,j=0;a[i]!=’\0’;i++)
if(a[i]!=’*’){a[j]=a[i];j++;}
a[j]=’\0’;
}
解析: 参考答案:中使用的算法是:将不是’*’号的字符往前移动,依次放入a[0]、a[1]、a[2]、……等数组元素中。程序中利用for循环,从第一个字符开始依次取出字符进行判定,若不是’*’号,则往前赋值。变量i作为每次取出元素的下标,变量j记录赋值的位置。跳出循环后,将字符串结束标记’\0’赋值到相应位置,完成删除操作。
本题还派生了很多题目:
(1)假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中前导*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G*********,删除后,字符串中的内容应当是:A*BC*DEF*G********。
参考程序:
#include<stdio.h>
void fun(char *a){
int i,j;
i=j=0;
while(a[i]==’*’)i++;
while(a[i]!=’\0’){
a[j]=a[i];j++;i++;
{
a[j]=’\0’;
}
void main( ){
char s[81];
printf("Enter a string: \n");gets(s);
fun(s);
printf("The string after deleted: \n");puts(s);
}
(2)假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导和尾部的*号之外,将串中的其他*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内容应当是:****ABCDEFG********。
参考程序:
#include<stdio.h>
void Nn(char *a,char *h,char *p){
int i,j;
a=h;
for(i=j=0;a+i<=p;i++)/*将字符串中从第一个字母开始到最后一个字母之间的*号删除*/
if(a[i]!=’*’){a[j]=a[i];j++;}
while(a[i]!=’\0’){a[j]=a[i];j++;i++;} /*将字符串尾部的*号顺序前移*/
a[j]=’\0*; /*给字符串赋上字符串结束标记*/
}
void main( ){
char s[81],*t,*f;
printf("Enter a string: in");
gets(s);
t=f=s:
while(*t)t++;
t--;
while(*t==’*’)t--;
while(*f==’*’)f++;
fun(s,f,t);
printf("The string after deleted: in");
puts(s);
}
(3)假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中后导*号。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内容应当是:****A*BC*DEF*G。
参考程序:
#include<stdio.h>
void fun(char *a){
int i,j;
for(i=0;a[i]!=’\0’;i++) /*找到最后一个字母的位置记录在变量j中*/
if(a[i]!=’*’)j=i;
a[j+1]=’\0’;/*将字符串结束标志赋值到最后一个字母后面,即可删除后续*号*/
}
void main( ){
char s[81];
printf("Enter a string: \n");gets(s);
fun(s);
printf("The string after deleted: \n");puts(s);
}
[归纳总结] 本套试题的程序填空和程序设计题考查的是数据的删除。数据的删除操作可以采用两种方法:第一种方法,可以在原数组基础上,通过数据移动,将需要删除的数据覆盖;第二种方法,引入一个中间数组,将不需要删除的数据放入其中,再将该数组赋值给原数组,从而达到删除某些数据的目的。实际上,数据的删除实质也是数据的移动,即将不需要删除的字符往前移动,依次放入数组对应的单元中。
删除字符算法的常用程序如下:
void fun(char *s){
int i,j;
fnr(i=j=0;s[i]!=’\0’;i++)
if(…){ /*需要保留字符的条件*/
s[j]=s[i];
j++;
s[j]=’\0’;
}