首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-11-08 
关于去掉字符串中的空格的问题...voiddel_space(char*str), 将str字符串中的空格原地删除(就是删除空格),

关于去掉字符串中的空格的问题...
void del_space(char *str), 将str字符串中的空格原地删除(就是删除空格),但不能申请新的buffer,同时要保证O(n)级的时间复杂度。

总感觉自己写的不大好...大家能否写一下,谢谢!

[解决办法]

C/C++ code
void        strallcut(char *str){        int        i,j=0;        char sp[512];        for (i = 0; *(str + i) != '\0'; i++) {                if (*(str + i) == ' ' )                        continue;                sp[j++]=*(str + i);        }        sp[j] = 0;        strcpy(str, sp);}
[解决办法]
C/C++ code
include <iostream> using namespace std; int main() {char c=' ',ch; cout<<"输入一串字符:"; cin>>ch; while((ch=getchar())!='\n')     //调用getchar()函数,对输入的每个字符检查{ if(ch==' ')           //检查到遇到的字符是空格; //空语句,起到删除作用 else cout<<ch;} cout<<endl; return 0; }
[解决办法]
不是我写的。
执行效率最快:
#define MAXLINE 4096
char *trim(const char *str)
{
static char line[MAXLINE];
const char *pbegin;
char *p,*pend;
int i;

pbegin=str;
while (*pbegin==' ')
pbegin++;

p=line;
while (*p=*pbegin){
if ((*p==' ')&&(*(p-1)!=' '))
pend=p;
p++;pbegin++;
}
if (*(p-1)!=' ') pend=p;
*pend=0;
return line;
}
[解决办法]
C/C++ code
void  del_space(char  *str){  int i,len=strlen(str),p=0;  for(i=0;i<len;i++)    if(s[i]!=' ') s[p++]=s[i];  s[p]='\0';}
[解决办法]
C/C++ code
void        strallcut(char *str){        int        i,j=0;        for (i = 0; *(str + i) != '\0'; i++) {                if (*(str + i) == ' ' )                        continue;                *(str+j++)=*(str + i);        }         *(str+j)='\0';     }
[解决办法]
#include"stdio.h" 
#include"stdlib.h"
#include <string>
#include <iostream>
using namespace std;
void delblank(char *str)
{
char *p=str;
char *q=str;
int flag=0;
while ( *q++ ) ;
while ( *p )
{
if ( *p == ' ' )
{
for ( ++p ; p<=q ; ++p ) *(p-1)=*p;
flag=1;
}
if ( flag == 1 ) 
{
p=str; flag=0;
}
else
p++;
}
}

void main(void)
{
string ss=" sfsda fasfgr ";
char str[50];
memset(str,0,50); 
strcpy(str,ss.c_str());
delblank(str);
cout<<str<<endl;
}
[解决办法]
[code=C/C++][/code]void del_space(char *str)
{
int i,len=strlen(str),p=0;
for(i=0;i<len;i++)
if(s[i]!=' ') s[i]=s[i+1];
 
}

[解决办法]
你这样定义的char* str="hello world";是一个常量字符串,也就是说,你不能去改动它,一改就出错了。
你应该这样定义
char str[]="hello world";

[解决办法]


void strallcut(char *str)
{
int i,j=0;

for (i = 0; *(str + i) != '\0'; i++) 
{
if (*(str + i) != ' ' )
{
*(str + j) == *(str + i) ;
j++;
}
}
 }

[解决办法]

C/C++ code
int main() {     char s[] = "a  b   c d  ef";    int i,len=strlen(s),p=0;     for(i=0;i <len;i++)         if(s[i]!=' ') s[p++]=s[i];     s[p] = '\0';    return 0; }
[解决办法]
C/C++ code
#include <stdio.h>#include <string.h>void DelBlank(char *p){    while ( *p != '\0')    {        if ( *p == ' ')            memmove(p, p+1, strlen(p + 1) + 1);        else            p++;    }}int main(){    char a[32] = {0x00};    memcpy(a, "  a what a good boy",32);    DelBlank(a);    printf("%s\n",a);    return 0;}
[解决办法]
void DelSpace(char *sour){
int len = strlen(sour);
char *p1, *p2, *pTail = 0;
p1 = p2 = sour;
bool bHead = false, bTail = false;
for (int i = 0;i < len; i++){
if (!bHead){
if (' ' == *p2 || '\t' == *p2)
p2++;
else{
bHead = true;
*p1++ = *p2++;
}
}
else{
if (' ' == *p2 || '\t' == *p2){
if (!bTail){
pTail = p1;
bTail = true;
}
}
else
bTail = false;
*p1++ = *p2++;
}
}
*p1 = 0;
if (bTail)
*pTail = 0;
}
[解决办法]
C/C++ code
void del_space(char* str){    char* p=str;    char* v=str;    while(*p!=0)    {        if(*p==' ')        {            p++;            continue;        }        *(v++)=*(p++);    }    *v='\0';}
[解决办法]
C/C++ code
void del_space(char* str){    for (int i = 0, j = 0; str[i] = str[j++]; str[i] != ' ' && ++i);}
[解决办法]
C/C++ code
void dspace(char *str){    int j = 0;    for (int i=0;i<strlen(str);i++){        if (str[i]-0x20)str[j++]=str[i];else str[j] = str[i];    }    str[j] = 0;}int main(){    char str[] = "abc de ff!";    dspace(str);    cout<<str;}
[解决办法]
基本思路也就是遍历数组,当发现空格后就把后边的所有内容向前复制一位复制过程中再次发现空格就把后边内容向前移动的位数增加一,如此一次增加,直到复制完成,别忘了在最后一个字符后一个单元中存入'\0',使之成为一个字符串。(代码实现很简单这里由于时间关系就不给出了)
[解决办法]

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

int main()
{
char x[] = " dfg gg ggg666 65 5 555 88899 p ";
int i, j;

i = j = 0;

while (x[j])
{
if (x[j] != ' ')
x[i++] = x[j];
j++;
}
x[i] = '\0';

printf("[%s]\n", x);
return 0;
}

[解决办法]
void del_space(char *str)
{
int i, j;

i = j = 0;

while (str && str[j])
{
if (str[j] != ' ')
str[i++] = str[j];
j++;
}
str[i] = '\0';
}


[解决办法]

C/C++ code
void dspace(char *str){    for (int i=0,j=0;i<strlen(str)+1;i++)if (str[i]-0x20)str[j++]=str[i];else str[j] = str[i];}int main(){    char str[] = "abc de ff!";    dspace(str);    cout<<str;}
[解决办法]
1楼已经挺好的了
学习下5楼的,我不是很懂,做个注释先,期望有人做个更好的注释。
#define MAXLINE 4096 
char *trim(const char *str) 

static char line[MAXLINE]; 
const char *pbegin; 
char *p,*pend; 
int i; 

pbegin=str; 
while (*pbegin==' ') 
pbegin++; //找到第一个非空格字符
p=line; 
while (*p=*pbegin){ //判断很巧妙,一方面赋值,一方面判断字符串是否结束
if ((*p==' ')&&(*(p-1)!=' ')) 
pend=p; 
p++;pbegin++; //这里面就不是很懂了,很神奇。

if (*(p-1)!=' ') pend=p;
*pend=0; 
return line; //还是开辟了空间,跟lz要求不是很符合。
}

热点排行