2011-03-31 130 views
0

我試圖從程序中刪除字符串中的空格。 有人可以給我手?從字符串中刪除空格

int main() 
{ 
    char str[15]; 
    int i=0; 
    gets(str); 
    while(str[i] !=0){ 
     if(str[i] == 32) 
     { 
      str[i++] = str[i]; 
      str[i] = str[i++]; 
     } 
    } 
    str[strlen(i)] = '\0'; 
    printf("%s", str); 
    return 0; 
} 

THX

+0

哪些您發佈的當前代碼的缺點? – 2011-03-31 14:35:34

+0

它沒有工作。 str [strlen(i)] ='\ 0';將str [strlen(str)] ='\ 0'; – yEL155 2011-03-31 14:37:29

+0

作業?沒問題,如果是這樣,只需用標記標記,以便得到更好的答案 – pmg 2011-03-31 14:50:37

回答

1

你可以使用2個三分球。我不熟悉C,所以我想檢查str [i] == 0意味着字符串的結尾。

int main() 
{ 
    char str[15]; 
    int i=0; 
    int j=0; 
    gets(str); 
    while(str[i] !=0 && str[j] !=0){ 
     while(str[j] == 32) 
     { 
      j++; 
     } 
     if (str[j] ==0){ 
      break; 
     } 
     str[i] = str[j]; 
     i++; 
    } 
    str[strlen(i)] = '\0'; 
    printf("%s", str); 
    return 0; 
} 
+0

是的,當'gets'創建的字符串沒有溢出你給它的緩衝區時終止爲0(空)。 – 2011-03-31 14:45:33

3

那麼因爲您使用C修剪不是一個選項。 首先,你對這條線有什麼看法: str [i] = str [i ++]; ? 這與i ++的 基本相同;

我們的代碼:

char *mystring, *read, *write; 
// mystring gehts filled with a null terminated string here 
read = mystring; 
write = mystring; 
while(*read != '\0') { 
     if(*read == ' ') 
      read++; 
     else 
      *write++ = *read++; 
} 
*write = '\0'; 

如果你喜歡寫另一個字符串,只要寫點到您希望它是位置。不要忘記檢查你有足夠的空間;)

0

你打算在這種條件下發生什麼?

if(str[i] == 32) 
     { 
      str[i++] = str[i]; 
      str[i] = str[i++]; 
     } 

實際發生了什麼? (提示:重新讀取部上我++)

- 皮特

1

幾個問題:

  1. 永遠永遠永遠永遠永遠永遠使用gets。首先,它從C99開始不再使用,並且將從標準的下一版本中消失。其次,它在你的代碼中引入了一個故障點(不是可能是介紹,會介紹)。改爲使用fgets(str, sizeof str, stdin)代替gets(str)

  2. 使用字符常量,而不是數值,因爲所有的世界不是ASCII:

     
    if (str[i] == ' ') // not str[i] == 32 
    

  3. 空白包括標籤,換頁,返回等,而不僅僅是空間;而不是檢查單個值,請使用庫函數isspace()

  4. 以下行是一個問題:

     
    
    str[i++] = str[i]; 
    str[i] = str[i++]; 
     
    
    首先,這應該調用未定義的行爲;您正試圖在序列點之間多次讀取和更新一個對象。其次,我不確定這個邏輯。看起來你正在嘗試交換元素,而不是僅僅跳過一個元素。

  5. 你傳遞一個整數值到strlen:這是行不通的。它會將該整數值解釋爲一個地址(至少應該得到一個警告),結果可能不好。

您可以在一個循環有兩個數組索引做到這一點:

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
{ 
    char str[15]; 

    if (fgets(str, sizeof str, stdin) != NULL) 
    { 
    size_t r, w; 

    printf("Original: \"%s\"\n", str); 

    /** 
    * str[r] is the element that we are reading; str[w] 
    * is the element that we are writing 
    */ 
    for (r = 0, w = 0; str[r] != 0; r++) 
    { 
     if (!isspace(str[r])) // if str[r] is not a whitespace character 
     str[w++] = str[r]; // write it to str[w]; note that we only 
           // advance w for non-whitespace chars 
    } 
    str[w] = 0; // add the 0 terminator at the end 

    printf("Stripped: \"%s\"\n", str); 
    } 
    return 0; 
} 

顯然,這改變了原來的字符串。如果由於某種原因需要保留原始輸入,則必須聲明第二個緩衝區來保存修改過的字符串。

0

此代碼是速度快,工作正常..希望這有助於爲UR情況下..複製並粘貼到一個文件,並測試它..

#include <stdio.h> 
main() 
{ 
    char str[100]; 
    int len = 0; 
    gets(str); 
    len = strlen(str); 
    int i = 0; 
    while(str[i]!='\0') 
    { 
     if(str[i] == ' ') 
     { 
      memcpy(&str[i], &str[i+1], len - i); 
      len--; 
     } 
     i++; 
    } 
    str[len] = '\0'; 
    printf("O/P : %s\n",str); 
} 

這工作得很好..