我的问题是这个运行结果字符串末尾的*出不来,是思路有问题吗在调用函数下面那一段,应该怎么改呢
执行完第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;
}
没看太懂你说的题意,大概猜测是保留第一个’‘和最后一个''。
#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;
}