截断给定字符串中的空格

时间:2013-08-29 20:19:57

标签: c

输入 - Hello World

输出 - HelloWorld

这是我用c写的程序。

但我得到了分段错误。

我使用的逻辑是,当我找到一个空格我用下一个字符交换到结尾然后插入一个'\ 0'字符

#include <stdio.h>

int main()    
{    
        char s[12]="Hello World";    
        char *t;    
        t=s;    
        while(*t)    
        {    
                char *p;    
                p=t;    
                if(*p==' ')    
                {    
                        while(*p !='\0')    
                        {    
                                char x;    
                                x=*p;   
                                *p=*(p+1);    
                                *(p+1)=x;   
                                p++;    
                        }    
                        *(p-1)='\0';    
                }    
                t++;   
        }
        printf("%s\n",s);   
}

4 个答案:

答案 0 :(得分:3)

K&amp; R风格副本:

#include <stdio.h>

int main()
{
        char s[12]="Hello World";
        char *src, *dst;
        for(src=dst=s; *dst = *src; src++) {
                if( *dst == ' ') continue;
                dst++;
                }
        printf("%s\n",s);
        return 0;
}

答案 1 :(得分:1)

通过调用此函数来替换讨厌的嵌套while循环。

void siftLeftAtCurrentPos(char* cstr)
{
   while(*cstr)
   {
     *cstr = *(cstr + 1);
      cstr++;
   }
}

然后在t

之前不要递增*p != ' '

答案 2 :(得分:0)

刚拿出来:

char x;    
x=*p;   
*(p+1)=x;

这就是问题所在。

答案 3 :(得分:0)

你的内部while循环是一个无限循环。当你交换你最后制作的空间时,下一个角色也将是一个空格。

正如乔纳森的回答所提到的,你可以通过左移而不是交换值来解决这个问题。也就是说,您可以制作一个更有效的算法,在一次传递中删除空格,而不使用嵌套循环。如果你有一个充满空格的字符串,你当前的算法将采用二次时间...

char* in = s; //next character to read;
char* out = s; //where to write the next non-space character;
//copy all the non spaces
while(*in){
   if(*in != ' '){
     *out = *in;
     out++;
   }
   in++;
}
//now fill the rest of the strings with null values:
while(out != in){
   *out = '\0';
   out++;
}