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

chenlei613 2008-11-29 03:23:49
请各位大侠用C语言编写,很急!各位帮帮忙。
...全文
259 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);
}
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

70,038

社区成员

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

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