编写函数fun,它的功能是:除了字符串前导和尾部的 号之外,将串中其他*号全部删除。

我的问题是这个运行结果字符串末尾的*出不来,是思路有问题吗在调用函数下面那一段,应该怎么改呢

img

执行完第13行代码后,字符指针t指向了字符串结尾,所以第14行是计算不出尾部的星号个数的。

如果题目是求除字符串的前导和尾部星号之外,其他位置的星号都删除的话,将复制中间字符和尾部字符的部分修改下应该就可以了。

修改如下:



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 40

void fun1(char *a){
    
    int i=0,j,m=0,n=0;
    char *t=a,*p=a;
    
    //  为存储字符串结果申请一份和字符串a一样大小的空间 
    char * temp=(char*)malloc(sizeof(char)*(strlen(a)+1));
    
    // 如果前导为*号,则直接存储临时结果数组 
    while(*p=='*'){
        temp[i]=*p;
        i++;
        p++;
    }
    
    
    
    // 让字符指针t指向字符串结尾 
    while(*t){
        t++;
    }
    t--; // 指向字符串空字符前一个字符 
    
    // 让字符指针t指向尾部连续星号字符的前一个字符 
    while(*t=='*'){
        t--;
    }
    
    // 将前导星号和尾部星号之间的 除星号之外的其他字符都复制到临时结果数组 
    while(p<=t){
        if(*p!='*'){
            temp[i]=*p;
            i++;
        }
        p++;
    }
    
    // 将尾部的星号存入临时结果数组 
    while(p<(a+strlen(a))){
        temp[i]=*p;
        i++;
        p++;
    }
    
    // 临时结果数组最后补上一个字符串结束的空字符 
    temp[i]='\0';
    

    // 将临时结果数组的字符复制到 指针a 的位置 
    strcpy(a,temp);  
    
    free(temp);  // 释放申请的内存 
    
//    for(int i=0;i<=strlen(temp);i++){
//        printf("a[%d]=%c,%d\n",i,a[i],a[i]);
//    }
    
} 

int main(){
    
    char a[N];
    int i,m=0,n=0;
    printf("请输入只包含字母和*号的字符串:\n");
    gets(a);
    fun1(a);
    printf("删除后:\n");
    puts(a);
    
    
    return 0;
    
}

img

没看太懂你说的题意,大概猜测是保留第一个’‘和最后一个''。

#include<stdio.h>
#include<string.h> 
#define N 40
void fun1(char* a)
{
    int i = 0;
    //以空间换时间思路,否则数组a每发现一次'*',后面数据都要整体移动一位来覆盖掉'*' 
    char b[N]={0};    
    strcpy(b,a);    //将字符串拷贝到数组b中 
    char *p=b;
    char *begin=strchr(b,'*');//找到第一次出现'*'的指针位置 
    char *end=strrchr(b,'*');//找到最后一次出现'*'的指针位置 
    
    while(*p){    
        if(p>begin&&p<end){    //在第一次出现'*'和最后一次出现'*'的中间位置 
            if(*p!='*'){    //判断,如果不是'*'才赋值 
                a[i++]=*p;
            }
        }else{                //前部和尾部直接赋值 
            a[i++]=*p;    
        }
        p++;
    }
    a[i]='\0';        //最后赋值'\0'分割结尾 
}

int main()
{
    char a[N];
    printf("请输入只包含字母和*号的字符串:\n");
    gets(a);
    fun1(a);
    printf("删除后:\n");
    puts(a);
    return 0;
}