2012-06-24 168 views
0

我可以知道是否有任何方法可以從C中的字符串中刪除非字母符號?C:刪除字符串中的符號

比如我有一個char array[5][5]有:"hi", "my..", "name", "is,,", "bob!"

所需的輸出:"hi", "my", "name", "is", "bob"

反正是有刪除的符號?

+6

是的,有一種方法。我建議你盡力去做,看看你在提問之前想出了什麼,其目的不是爲你寫代碼。但是,爲了幫助您,請查看ctype.h –

+0

順便說一句,這是http://stackoverflow.com/questions/6433866/how-to-find-non-alphanumeric-in-c我找到了通過搜索SO [c]字母數字 –

回答

3

這裏是一個非常簡單的實現:

void keepalnum(char *src) { 
    unsigned char *dest = src; 
    while ((*dest = *src++)) 
     dest += isalnum(*dest) ? 1 : 0; 
} 

的想法是超前的源指針每個副本後,但只有當你看到一個字母數字字符移動目標指針。

這裏是你如何使用它:

char str[] = "quick-brown fox jumps? over the.. lazy dog!"; 
keepalnum(str); 
printf("%s\n", str); 

prints

quickbrownfoxjumpsoverthelazydog 
+1

這當然不是我爲初學者提供的那種代碼......也不是我自己寫的那種代碼。它甚至是越野車,因爲人們不應該把字符傳給isalnum。更直接,沒有額外的商店和錯誤(抱歉,沒有格式):'unsigned char c; while((c = * srC++)!='\ 0')if(isalnum(c))* dest ++ = c; * dest ='\ 0';' –

+0

@JimBalter我的解決方案與K&R第5章中的'strcpy'的最新版本沒有多大區別。我相信任何想用C語言編程的人都需要對K&R有深入的瞭解。但是我試圖避免設置太高的代碼:例如,在我的代碼中,我更喜歡'dest + =! !isalnum(* dest)'而不是三元運算符,但是一次去除會消耗太多。 – dasblinkenlight

+0

因爲在K&R的第一版發佈之前,我一直在寫C代碼。這是一個很好的資源,但不是編碼技術的最後一個字。而且你的代碼不會通過我的評論甚至我的面試。 –

1

使用C isalnum(int ch);您可以刪除既不是數字也不人物像這樣的過濾器值:

#include <stdio.h> 
#include <string.h> 

#define ARRAY_LEN 5 
#define STR_LEN 5 

int main(int argc, char *argv[]) 
{ 
    int rc = 0; 

    char array[5][5]; 
    char out_str[5] = {0}; 

    int array_idx, str_idx, cpy_idx; 

    strcpy(array[0], "hi"); 
    strcpy(array[1], "my.."); 
    strcpy(array[2], "name"); 
    strcpy(array[3], "is,,"); 
    strcpy(array[4], "bob!"); 

    for(array_idx=0; array_idx < ARRAY_LEN; array_idx++) 
    { 
     cpy_idx = 0; 

     for(str_idx=0; str_idx < STR_LEN; str_idx++) 
     { 
      if(isalnum(array[array_idx][str_idx])) 
      { 
       out_str[cpy_idx++]= array[array_idx][str_idx]; 
      } 
     } 

     out_str[cpy_idx++] = '\0'; 
     printf("%s ", out_str); 
    } 

    printf("\n"); 

    return rc; 
} 

這個例子沒有結束邊界檢查,因爲例子wa s圍繞4個字符的字符串編碼加上終止0.實際上,我聲明的緩衝區大於我打算處理的最大字符串,但我仍然計算被複制的字符數,這在這裏沒有完成。