输入 - 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);
}
答案 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++;
}