2012-02-24 83 views
0

我使用fgets輸入字符串,例如: 「你好,世界」。我想嘗試刪除這個詞之間的空格,但是我正在嘗試不斷返回hello @ world(其中@是一個隨機字符)。C - 刪除字符串中的空白字符

void sortString(char phrase[]) 
{ 
    int i, j; 
    char temp[200]; 


    for(i = 0; i < 200; i++) 
    { 
     if(!(isspace(phrase[i]))) 
     { 
      temp[i] = phrase[i]; 
     } 
    } 

    printf("%s", temp); 
} 

所以我基本上是從短語到一個臨時數組複製的字符[I]過,如果它不是一個空白,但我不能確定,爲什麼我得到一個隨機字符,而不是隻是,例如,helloworld。

+1

你在那裏獲得隨機字符,因爲你沒有指定你想要那裏。 – Eimantas 2012-02-24 15:29:25

回答

5

每當你在phrase看到一個空白字符,你只是跳過同等位置temp,離開它未初始化(含垃圾)。您需要一個單獨的計數器來跟蹤temp陣列中的當前位置。

此外,您應該檢查phrase中以\0字符結尾的字符串,而不是盲目複製所有200個字符,並確保temp字符串也安全地終止。

確保temp[]實際上足夠大,以便將結果輸出留作進一步練習。 (看看Gandaro的答案的線索。)

void sortString(char phrase[]) 
{ 
    int i, j; 
    char temp[200]; 

    for(i = 0, j = 0; phrase[i] != '\0'; i++) 
    { 
     if(!(isspace(phrase[i]))) 
     { 
      temp[j++] = phrase[i]; 
     } 
    } 

    temp[j] = '\0'; 
    printf("%s", temp); 
} 
3

至少有3個問題:

  • 確定源字符串將永遠是200個字符長?你不應該檢查\0嗎?

  • 您需要爲temp使用單獨的索引。現在,當您跳過字符時,您會在temp中留下未初始化的「漏洞」。

  • 您需要零終止temp

0

即使你跳過temp[i]=phrase[i],你每次循環增加溫度中的位置。您需要一個變量來跟蹤獨立於i的臨時位置。

1

因爲您沒有爲空格所在位置的字符串賦值。

的工作準則是:

void sortString(char phrase[]) 
{ 
    int i = 0, j; 
    char *temp = malloc(strlen(phrase) + 1); 

    if (temp == NULL) 
    { 
     perror("A fatal error occured...\n"); 
     return; 
    } 

    for (j = 0; phrase[j]; j++) 
    { 
     if(!(isspace(phrase[j]))) 
     { 
      temp[i++] = phrase[j]; 
     } 
    } 

    temp[i] = 0; 

    printf("%s", temp); 
    free(temp); 
} 
+0

如果詞組中有超過200個非空格字符,則失敗。 – swestrup 2012-02-24 15:44:51

+0

不是在我編輯之後。 :P – Gandaro 2012-02-24 15:46:04

+0

當然,但現在你有內存泄漏。 :-P – swestrup 2012-02-25 16:05:11