1

输入-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

4 回答 4

3

K&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;
}
于 2013-08-29T20:40:14.673 回答
1

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

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

然后不要增加t,直到*p != ' '

于 2013-08-29T20:27:51.040 回答
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++;
}
于 2013-08-29T20:44:34.363 回答
0

只需取出:    

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

这就是问题。

于 2013-08-29T20:39:56.503 回答