如何删除字符串中"("和")"之间的字符串?

chenlei613 2008-11-29 03:23:49
请各位大侠用C语言编写,很急!各位帮帮忙。
...全文
223 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
honesy 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Miss_yuan 的回复:]
吃饭回来,又重写了一个,只找范围最大的那组括号,中间的都删了,不过不知道LZ额要求到底是什么样的

C/C++ code
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void fun(char* ch)//删除ch中被()中的串,无论有多少对(),()中的串都删了
{
int i;
char *p=NULL,*q=NULL,*r=ch;
while(*r!='\0') //从前向后找第一个'('
{
if(*r=='(')
{

[/Quote]

如果有多个嵌套的或者多个不嵌套的可能有问题吧.....
honesy 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiaqq 的回复:]
简单,厉害
C/C++ codemain()
{
char a[10];
scanf("%s",&a);//感觉错了...
a[1]=')';
a[2]='\0';
printf("%s",a);
}



改为上面的更好,
输入(123456) 按回车
输出()
[/Quote]
zhouhupingluo 2008-11-29
  • 打赏
  • 举报
回复
栈,碰到后括号就弹栈,直到前括号
多米蒂尔 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 candy110 的回复:]
LS的这个已经不错了.
但是如果遇到嵌套的括号好像会出错哦:)
建议LZ自己改一下.
用栈比较好.
[/Quote]
这个碰到嵌套括号是有问题的,如果串是:1(2(3)4 结果是:1(24 正确的应该是:14 没考虑清楚就发了- -#
后写的这个应该没问题了,应为只找范围最大的那组括号,中间的内容都不考虑,比较彻底
用栈也好,不过还要写栈本身的一些函数,麻烦,以前数据结构实验时,我用栈做过类似的题目

多米蒂尔 2008-11-29
  • 打赏
  • 举报
回复
吃饭回来,又重写了一个,只找范围最大的那组括号,中间的都删了,不过不知道LZ额要求到底是什么样的

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void fun(char* ch)//删除ch中被()中的串,无论有多少对(),()中的串都删了
{
int i;
char *p=NULL,*q=NULL,*r=ch;
while(*r!='\0') //从前向后找第一个'('
{
if(*r=='(')
{
p=r;
break;
}
r++;
}
if(p) //如果串有'('则从后向前找第一个')'
{
r=&ch[strlen(ch)-1]; //r指向最后一个元素
do
{
if(*r==')')
{
q=r;
break;
}
r--;
}while(r!=&ch[0]&&r!=p); //如果在找')'过程中先遇到p,则说明没有可配对的括号,q=NULL
}
if(p&&q) //如果最外层的'('')'都存在,则删除中间的串
strcpy(p,++q);
return;
}

void main()
{
char temp[100];
printf("input string:");
gets(temp);//输入一个串
fun(temp);//按要求删除
puts(temp);//再输出看看
system("pause");
}

毛员外 2008-11-29
  • 打赏
  • 举报
回复

遍历嘛
把括号记着(指针)
来个for循环,在两个括号间循环删
要是有多个括号对,就遍历完嘛
就是遇到括号滴时候记到起

over
jingyuge 2008-11-29
  • 打赏
  • 举报
回复
我这有一个题和答案,前几天写的,和你问的这种情况类似,利用栈来解决
设java语言中包含如下符号/* */,(),[],{},编写程序检测一段java代码中符号是否正确
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define STACK_INIT_SIZE 100//栈的初始大小
#define STACKINCREMENT 10//栈每次增加的大小

struct Stack
{
char *base;
char *top;
int stacksize;
};

Stack *InitStack()//建立栈
{

Stack *s = (Stack*)malloc(sizeof(Stack));
s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base)exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return s;
}

void Push(Stack *s,char ch)//向栈顶插入元素
{
if(s->top-s->base>=s->stacksize)
{
s->base=(char *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(Stack));
if(!s->base)exit(0);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=ch;

}

char Pop(Stack *s)//删除栈顶
{
char ch;
if(s->top==s->base)return 0;
ch=*--s->top;
return ch;

}

char Gettop(Stack *s)//返回栈顶元素
{
char e;
if(s->top==s->base)return NULL;
e=*(s->top-1);
return e;
}

void input(Stack *s)//对输入的/* */,(),[],{}进行处理
{
Stack *x=InitStack();
int flag1=0,flag2=0,flag3=0,flag=0;
char ch;
do
{
ch=getche();
if(ch==13)printf("\n");
if(ch==42&&Gettop(x)==47)flag=1;
if(flag==0&&ch==47&&Gettop(x)==42){printf("错误4");break;}
if(Gettop(x)!=42&&ch==47||Gettop(x)!=47&&ch==42)Pop(x);
if(flag==1&&ch==47&&Gettop(x)==42){flag=0;Pop(x);Pop(x);Pop(x);}
else
{
if(ch==42||ch==47)Push(x,ch);
}
if(ch==41&&Gettop(s)!=40){printf("1您的输入有误");break;}
if(ch==125&&Gettop(s)!=123){printf("2您的输入有误");break;}
if(ch==93&&Gettop(s)!=91){printf("3您的输入有误");break;}
if(ch==2&&Gettop(s)!=1){printf("3您的输入有误");break;}
if(ch==40||ch==123||ch==91)
Push(s,ch);
if(Gettop(s)==40&&ch==41)Pop(s);
if(Gettop(s)==123&&ch==125)Pop(s);
if(Gettop(s)==91&&ch==93)Pop(s);
}while(ch!='#');
}

void main()
{
Stack *s=NULL;
s=InitStack();
input(s);
}
ldhshao 2008-11-29
  • 打赏
  • 举报
回复
查找,并匹配就可以了。
先读入字符,看它是否是'(',记其序号i,读到下一个匹配的')',记其序号j,
将j连同其后的字符,提前j-i+1位,总个数减小j-i+1.
wangyaosuper 2008-11-29
  • 打赏
  • 举报
回复
另外申请一个目标串,把源中的内容一个一个的往目标传里考,遇到一个(,就停止拷贝,遇到了)就重新开始copy



也可以在扫描的同时
初始时count = 0;
遇到一个(, 就count ++ ,
遇到一个) , 就count --;

当count == 0 的时候,就将源串中的内容往目的串中copy
candy110 2008-11-29
  • 打赏
  • 举报
回复
LS的这个已经不错了.
但是如果遇到嵌套的括号好像会出错哦:)
建议LZ自己改一下.
用栈比较好.
多米蒂尔 2008-11-29
  • 打赏
  • 举报
回复
看看这个可满足要求?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void del(char *ch,char *p,char *q)//删除ch中p,q指向开始和结尾的子串
{
do
{
*(p++)=*(++q);
}while(*q!='\0');

}

void fun(char* ch)//删除ch中被()中的串,无论有多少对(),()中的串都删了
{
int i;
char *p=NULL,*q=NULL,*r=ch;
while(*r!='\0')
{
if(*r=='(')
p=r;
else if(*r==')')
{
if(p)
{
q=r;
del(ch,p,q);
p=NULL;
q=NULL;
r=ch;
}
}
r++;
}
return;
}



void main()
{
char temp[100];
printf("input string:");
gets(temp);//输入一个串
fun(temp);//按要求删除
puts(temp);//再输出看看
system("pause");
}

wzg112 2008-11-29
  • 打赏
  • 举报
回复
LS的,你这样输没意义啊,要是输123(23)2怎么办
还是遍历字符串吧,建议使用栈,我记得是编译原理这方面的东东吧
jiaqq 2008-11-29
  • 打赏
  • 举报
回复
简单,厉害
main() 
{
char a[10];
scanf("%s",&a);
a[1]=')';
a[2]='\0';
printf("%s",a);
}


改为上面的更好,
输入(123456) 按回车
输出()
tlw112 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lihanying2008 的回复:]
题目有么?说的不够清楚
我写个简单的哈
#include <stdio.h>
main()
{
char a[10]="(abc)";
a[1]=')';
a[2]='\0';
printf("%s",a);
}
[/Quote]
哈哈
lihanying2008 2008-11-29
  • 打赏
  • 举报
回复
题目有么?说的不够清楚
我写个简单的哈
#include <stdio.h>
main()
{
char a[10]="(abc)";
a[1]=')';
a[2]='\0';
printf("%s",a);
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧