qq_45903297
2021-05-25 21:39
采纳率: 50%
浏览 32

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; 
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • benbenli 2021-05-26 11:52
    已采纳

    去掉了下标,全用指针。

    #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****
    
    点赞 评论
  • benbenli 2021-05-25 23:29

    我把输入改为: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****

     

    点赞 评论
  • benbenli 2021-05-26 21:07

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

    点赞 评论

相关推荐 更多相似问题