学校的一个习题,我自己验证无误,但过不了学校的考试系统。
题目如下:
假定输入的字符串中只包含字母和号。请编写函数fun,它的功能是: 除了字符串前导和尾部的号之外, 将串中其他*号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。
在编写函数时,不得使用C语言提供的字符串函数。
注意: 部分源程序在文件PROG1.C文件中。
主函数可任意改动,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
#include <conio.h>
void fun( char *a, char *h,char *p )
{
//--ksstart(注释不能删除)—
//考生代码从此开始编写
int i=0,j;
while(h[i]!=p[0]){
if(h[i]=='*'){
//当数组中间出现*时,删除后要产生如下三种变化
j=i;
p--;
//一·数据末尾指针p向前移动一位
while(h[j]!='\0'){
h[j]=h[j+1];
//二·所有数据向前移动一位
j++;
}
}
else{
i++;
//三·控制操作的循环数i需要不变
//即只有h[i]!='*'时,i才正常进位
}
}
//--ksend---
}
int main()
{
//自己编写main()
char a[]={"***a*bc***d*ef****"};
char *h,*p;
h = &a[3];
p = &a[13];
fun(a,h,p);
printf("%s",a);
return 0;
}
去掉了下标,全用指针。
#include <stdio.h>
void fun( char *a, char *h, char *p)
{
//--ksstart(注释不能删除)—
//考生代码从此开始编写
// 跳过尾部的星号
while (p > h && *p == '*')
--p;
while (h < p){
if (*h == '*') {
//当数组中间出现*时,删除后要产生如下三种变化
//一·数据末尾指针p向前移动一位
p--;
//二·所有数据向前移动一位
for (char* q = h; *q != '\0'; ++q){
*q = *(q + 1);
}
}
else {
//三·控制操作的循环数
++h;
}
}
//--ksend---
}
int main()
{
//自己编写main()
char a[] = {"***a*bc***d*ef****"};
char *h, *p;
h = &a[3];
p = &a[13];
fun(a, h, p);
printf("%s\n", a);
char b[] = {"***a*f****"};
h = &b[3];
p = &b[5];
fun(b, h, p);
printf("%s\n", b);
return 0;
}
// Output
***abcdef****
***af****
我把输入改为:char a[]={"***a*f****"};
得到的输出是 ***af
不符合题目要求。
执行你的逻辑之前,首先需要想左移动p,跳过尾部的星号。
既然用指针,代码里就不要出现下标了。变量i是你定义的还是题目定义的?其实不需要用下标的,全部用指针最合适。我假设i是题目定义的吧,因为注释里提到了i。
循环条件 while(h[i]!=p[0]) 错了,不能比较值,而要比较地址。否则可能循环提前结束了。
我改了一下:
#include <stdio.h>
void fun( char *a, char *h,char *p )
{
//--ksstart(注释不能删除)—
//考生代码从此开始编写
/* 跳过尾部的星号 */
while (p > h && *p == '*')
--p;
int i=0,j;
while (h + i < p){
if(h[i]=='*'){
//当数组中间出现*时,删除后要产生如下三种变化
j=i;
p--;
//一·数据末尾指针p向前移动一位
while(h[j] != '\0'){
h[j]=h[j+1];
//二·所有数据向前移动一位
j++;
}
}
else{
i++;
//三·控制操作的循环数i需要不变
//即只有h[i]!='*'时,i才正常进位
}
}
//--ksend---
}
int main()
{
//自己编写main()
char a[]={"***a*bc***d*ef****"};
char *h,*p;
h = &a[3];
p = &a[13];
fun(a,h,p);
printf("%s\n",a);
char b[]={"***a*f****"};
h = &b[3];
p = &b[5];
fun(b,h,p);
printf("%s\n",b);
return 0;
}
// Output
***abcdef****
***af****
如果我的回答堆你有帮助,麻烦你点采纳。谢谢!