c语言 一个指针相关问题

学校的一个习题,我自己验证无误,但过不了学校的考试系统。

题目如下:

假定输入的字符串中只包含字母和号。请编写函数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****

 

 

如果我的回答堆你有帮助,麻烦你点采纳。谢谢!