关于去掉字符串中的空格的问题...

MJKBKBMJ 2009-07-01 05:06:12
void del_space(char *str), 将str字符串中的空格原地删除(就是删除空格),但不能申请新的buffer,同时要保证O(n)级的时间复杂度。

总感觉自己写的不大好...大家能否写一下,谢谢!
...全文
1040 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
luohemanxing 2012-11-01
  • 打赏
  • 举报
回复
忽视上面两个吧,'\0'那错了。下面的经过验证是对的

// 删除字符串空格.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>

void deletespace(char * str)
{
int len=strlen(str);
int i;int j=0;
for( i=0;i<len;i++)
{
while(*(str+i)==' ')
i++;
*(str+j)=*(str+i);
j++;
}
*(str+j)='/0';
printf("%s",str);

}


int _tmain(int argc, _TCHAR* argv[])
{
char a[]=" 89 8 9";
deletespace(a);
return 0;
}
luohemanxing 2012-11-01
  • 打赏
  • 举报
回复
// 删除字符串空格.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>

void deletespace(char * str)
{
int len=strlen(str);
int i;int j=0;
for( i=0;i<len;i++)
{
while(*(str+i)==' ')
i++;
*(str+j)=*(str+i);
j++;
}
*(str+j)='/0';
printf("%s",str);

}


int _tmain(int argc, _TCHAR* argv[])
{
char a[]=" 89 8 9";
deletespace(a);
return 0;
}
luohemanxing 2012-11-01
  • 打赏
  • 举报
回复
// 删除字符串空格.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>

void deletespace(char * str)
{
int len=strlen(str);
int i;int j=0;
for( i=0;i<len;i++)
{
while(*(str+i)==' ')
i++;
*(str+j)=*(str+i);
j++;
}
*(str+j)='/0';
printf("%s",str);

}


int _tmain(int argc, _TCHAR* argv[])
{
char a[]=" 89 8 9";
deletespace(a);
return 0;
}
gaomingok 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 billow_zhang 的回复:]
这个问题,逻辑上大家都容易实现.关键看怎么写简单明了的代码. 感觉22楼的是一个比较简洁的方法.使用遇到空格就全左移显然是效率低下的方法.
下面我再写一个. 相对于22楼的程序,少定义了一个变量,可读性也显得更好些.

void del_str_space(char *s)
{
char *p = s;

while( (*p = *(s++)) != '\0' )
if ( *p != ' ' )
p++;

}
[/Quote]
少变量?s++了,返回后能得到什么呢?
jack_doson 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 baihacker 的回复:]
C/C++ codevoiddel_space(char*str)
{for(inti=0, j=0; str[i]=str[j++]; str[i]!=''&&++i);
}
[/Quote]

强大
wxgiter 2009-07-02
  • 打赏
  • 举报
回复
22楼很强大,呵呵
phil1984 2009-07-02
  • 打赏
  • 举报
回复
char p[];
*std::remove_copy_if( p, p + sizeof p, p, std::bind1st( std::equal_to<char>(), ' ' ) )=0;
ForestDB 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 baihacker 的回复:]
C/C++ codevoiddel_space(char*str)
{for(inti=0, j=0; str[i]=str[j++]; str[i]!=''&&++i);
}
[/Quote]
就这个了。
billow_zhang 2009-07-02
  • 打赏
  • 举报
回复
这个问题,逻辑上大家都容易实现.关键看怎么写简单明了的代码. 感觉22楼的是一个比较简洁的方法.使用遇到空格就全左移显然是效率低下的方法.
下面我再写一个. 相对于22楼的程序,少定义了一个变量,可读性也显得更好些.

void del_str_space(char *s)
{
char *p = s;

while( (*p = *(s++)) != '\0' )
if ( *p != ' ' )
p++;

}

happynxy 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 baihacker 的回复:]
C/C++ codevoiddel_space(char*str)
{for(inti=0, j=0; str[i]=str[j++]; str[i]!=''&&++i);
}
[/Quote]

大哥,偶像呀
todaylxp 2009-07-02
  • 打赏
  • 举报
回复
用两个偏移量:扫描(的)偏移量和复制(的)偏移量
如果空字符,不复制(空格),扫描偏移量后移,但不移动复制偏移量
如果不是空格,将该字符拷贝至空格的位置,扫描偏移量后移,复制偏移量后移

以下程序将验证可行。

void del_space(char *str)
{
if(NULL == str)
return ;

size_t len = strlen(str);
size_t index = 0 ;
size_t pos = 0 ;

while(index < len)
{
if(str[index] != ' ')
{
str[pos] = str[index];

index ++ ;
pos ++ ;
}else
{
index ++ ;
}
}
}
yangyunzhao 2009-07-02
  • 打赏
  • 举报
回复
楼上的方法没有考虑这种情况:如果出现连续的10个空格,岂不是要移动10次,应该只移动1次的。
Damn_boy 2009-07-02
  • 打赏
  • 举报
回复
找到空格,空格以后的元素全不向前移动,
直到串尾
ysysbaobei 2009-07-02
  • 打赏
  • 举报
回复
顶下
jeff_nie 2009-07-02
  • 打赏
  • 举报
回复
mark
申玉宝 2009-07-02
  • 打赏
  • 举报
回复
咋总觉得22楼的应该是

void del_space(char* str)
{
for(int i=0,j=0;str[i]!='' && ++i;str[i]=str[j++]);
}

夹心饼干 2009-07-02
  • 打赏
  • 举报
回复
这有什么好争的,就是把字符串指针当成一个数组,,循环遍利,碰到空格,则把空格后面的所有前移一位就好了
arthas7607 2009-07-02
  • 打赏
  • 举报
回复
哦,不用结尾。有结尾。
arthas7607 2009-07-02
  • 打赏
  • 举报
回复
22楼忘记结尾了吧。str[j] ='\0';
zhh157 2009-07-02
  • 打赏
  • 举报
回复
赞美一下
[Quote=引用 22 楼 baihacker 的回复:]
C/C++ codevoid del_space(char* str)
{
for (int i = 0, j = 0; str[i] = str[j++]; str[i] != ' ' && ++i);
}
[/Quote]
加载更多回复(32)

64,690

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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