关于改变字符串的问题

askquestion2002 2003-04-14 06:03:33
想写一个函数

int CutByChar(char *pszIn,char c)

想要实现的功能
将c第一次在pszIn出现的位置前的所有字符及c去掉,保留
c之后的所有字符,并且将这样的改变结果保留到pszIn中。

问题
1 使用char *pszIn,这样在函数中改变pszIn,改变的结果是否会反映
到pszIn中?
2 如何改变pszIn的内容,使c之后的所有字符保存到pszIn中,并且速度
要快?
...全文
102 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
messagebox 2003-04-14
  • 打赏
  • 举报
回复
//呵呵,不好意思,上面做的还是不对
int CutByChar(char *pszin, char c)
{
int i,t;
for(i=0; pszin[i] != c && pszin[i] != '\0'; i++)
;
t = i ; //t 为找到的c的下标
cout << t << endl ;
if(pszin[t] == '\0')
return 0 ;


for(i = t + 1 ; i < strlen(pszin) ; i++)
pszin[i - t - 1] = pszin[i] ;

pszin[i-t-1] = '\0' ;

return 1 ;
}


main()
{
char *pc = new char[6] ;
strcpy(pc, "hello") ;
cout << pc << endl ;
CutByChar(pc, 'e') ;
cout << pc << endl ;
delete [] pc ;
}
mr_oydy 2003-04-14
  • 打赏
  • 举报
回复
冷也好热也好改过来就好 :)
messagebox 2003-04-14
  • 打赏
  • 举报
回复
to mr_oydy(CA::*pmf)(unsigned*) :
我刚注意到这个问题了,应该是
int CutByChar(char *pszin, char c)
{
int i,t;
for(i=0; pszin[i]!='c' && pszin[i] != '\0';i++) /*找出‘c’
t=i;
if(pszin[t] == '\0')
return 0 ;

for(i=0;i<=t;i++)
pszin[i]=pszin[t+i]; /*实现功能*/

return 1 ;
}


main()
{
char *pc = new char[6] ;
strcpy(pc, "hello") ;
CutByChar(pc, 'e') ; //
delete [] pc ;
}

mr_oydy 2003-04-14
  • 打赏
  • 举报
回复
main()
{
char *pc = new char[6] ;
pc = "hello" ; // 野指针, pc的值已经不是指向char[6]了
CutByChar(pc, 'e') ; // 不能改变pc, 因为CutByChar的第一个参数是char*而不是char*&
delete [] pc ; //不能释放
}
messagebox 2003-04-14
  • 打赏
  • 举报
回复

//不好意思,上面delete语句写错了
int CutByChar(char *pszIn,char c)
{
while(*pszIn != c && *pszIn !='\0')
pszIn++ ;

if(*pszIn != '\0')
pszIn++ ;

return 1 ;
}
main()
{
char *pc = new char[6] ;
pc = "hello" ;
CutByChar(pc, 'e') ;
delete [] pc ; //空间全部在此释放了
}
messagebox 2003-04-14
  • 打赏
  • 举报
回复
int CutByChar(char *pszIn,char c)
{
while(*pszIn != c && *pszIn !='\0')
pszIn++ ;

if(*pszIn != '\0')
pszIn++ ;

return 1 ;
}
main()
{
char *pc = new char[6] ;
pc = "hello" ;
CutByChar(pc, 'e') ;
delete pc ; //空间全部在此释放了
}
messagebox 2003-04-14
  • 打赏
  • 举报
回复
to benniao2(笨):
for(i=0;i<=t;i++)
pszin[i]=pszin[t+i]; /*实现功能*/

这不对吧,应该是:
for(i = t + 1 ; i < strlen(pszIn) ; i++)
pszin[i - t - 1] ;
pszin[i - t] = '\0' ;
98440622 2003-04-14
  • 打赏
  • 举报
回复
楼主到底是想说明什么问题?!
我认为benniao2的方法就是正确的了,字串数组本身就没什么快速的查找方法,而且你的要求又规定只能是查找第一次出现的字符,所以我认为(笨)的方法可以了。
另外在实际问题中,我想你不会定义个字串有《三国演义》那么长吧!
battlet 2003-04-14
  • 打赏
  • 举报
回复
int CutByChar(char *pszIn,char c)
{
while(*pszIn != c && *pszIn != '/0')
pszIn++ ;

if (*pszIn != c)
pszIn++ ;

return 1 ;
}

关于: 如果移动指针到指定的字串,之后返回这个指针,那么前面的空间怎么办?
前面还有一些字符没有删除,是不是系统会自动把这个空间收回?或是发生
内存泄漏?

要看你的传入字符串是分配在什么地方,如果是分配在栈中(即局部变量)系统自动释放空间。
如果是在堆上分配的(即用new分配)的要自己手动删除,只要用处理前的指针删除就不会内存泄漏了。
askquestion2002 2003-04-14
  • 打赏
  • 举报
回复
messagebox(冷也好热也好活着就好)
如果移动指针到指定的字串,之后返回这个指针,那么前面的空间怎么办?
前面还有一些字符没有删除,是不是系统会自动把这个空间收回?或是发生
内存泄漏?

benniao2(笨)
查找字符位置,需要进行遍历。
但是删除字符时要进行大量的字符移动,速度应该受到很大的影响。
benniao2 2003-04-14
  • 打赏
  • 举报
回复
int cutbychar(char pszin[]) /*pszin 应是数组*/
{
int i,t;
for(i=0;pszin[i]!='c';i++) /*找出‘c’ 的位置*/
t=i;
for(i=0;i<=t;i++)
pszin[i]=pszin[t+i]; /*实现功能*/
return psain;
}
messagebox 2003-04-14
  • 打赏
  • 举报
回复
int CutByChar(char *pszIn,char c)
{
while(*pszIn != c)
pszIn++ ;
pszIn++ ;

return 1 ;
}
askquestion2002 2003-04-14
  • 打赏
  • 举报
回复
注:
要使用TC2.0中的字串处理函数。

69,369

社区成员

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

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