2013-08-29 33 views
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); 
} 

回答

1

換出討厭的嵌套while循環通過調用這個功能。

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

然後不增加t直到*p != ' '

+0

內循環的同時我寫* p = *(P + 1); p ++;非常感謝...它的工作......但是發生了什麼早...爲什麼它顯示錯誤..... – user2712068

+0

,但我使用x作爲字符變量用於交換... – user2712068

+0

@ user2712068當你將(p + 1)*設置爲x,則在最後一次傳遞中,您將丟失NULL,從而使循環無限。 –

0

就冒了出來:

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

這就是問題所在。

+0

爲什麼它是如此......如果我這樣做,實際上會發生什麼 – user2712068

+0

此時,您已經知道該字符將被覆蓋。當您將p + 1複製到p時,它變得更加複雜。 – Jiminion

3

ķ& [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優雅的解決方案。 –

+1

+1 cuz這是一個解決方案,將驅動OOP類型瘋狂。 – Jiminion

+0

呃,它只是K&R strcpy()中的一個變體(繼續當然可以避免;它只是出於教育目的;-) – wildplasser

0

你內心的,而循環是一個無限循環。當你交換空間時,你最終會做出下一個字符也是一個空格。

正如喬納森的回答中所提到的,您可以通過左移而不是交換值來解決這個問題。也就是說,你可以創建一個更有效的算法來刪除單個遍中的空格,而無需嵌套循環。您當前的算法需要二次時間,如果你有一個字符串,它是充滿空間......

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++; 
} 
現在