2014-02-25 51 views
0

我試過在谷歌上搜索它,並找不到一個簡單的答案,大多數問題都要求從字符串中刪除所有出現的字符,什麼不是。刪除字符串中的字符?

My pseudo code: 

for (e=0;e<length of string;e++){ 
    if (string[e] is not a number/alphabet){ 
     #delete it 
    } 
} 

有沒有一個簡單的內置方式做到這一點?

另外一個問題,我需要做if not isalnum(string[e]),我會怎麼做呢?

if !(isalnum(string[e]))還是if (isalnum(string[e]))!=0

+0

如果它既不是數字也不是字母,例如符號:&? – Hjorthenify

+0

亞我只保留它,如果它是一個數字或字母,沒有別的 – gptt916

回答

3

通常你會建立第二個數組並將有效的符號複製到那個數組中。

只有在將所有尾隨數字向下移動一步時,才能刪除數組內的數字,這非常低效。如果您需要一個容器類,您可以輕鬆地在中間刪除和添加項目,則應該使用linked list

您可以將isalnum的返回值視爲bool類型。因此無論是

if (!isalnum(string[e])) 

if (isalnum(string[e]) !=0) 

是精細和完全等效。

+0

我會用strncpy嗎? – gptt916

+0

我不知道,處理字符串的鏈表?我沒有關於用例的信息,但如果OP想要做的不僅僅是清理一些短的令牌,我會感到驚訝。移動角色在這裏不應該是一個很大的問題。 –

0

如果您使用ASCII格式的字符,這是一種方法。

char a[256]; // Some string 
char destination[256]; 
char * pos = destination; 
for(unigned int i=0;i>strlen(a)-1;++i) 
{ 
if(((a[i]>='A'&& a[i]<='Z') || (a[i]>='a'&& a[i]<='z') || (a[i]>='1'&& a[i]<='9'))) 
*pos = a[i]; //replaces letter with a whitespace 
++pos; 
} 
*pos = '\0'; 

基本上它它其轉換的信corrosponding intenger,然後將它表示A-Z,A-Z和1-9之間的字母的範圍內檢查其。

+0

這不是問題中提出的問題。他想**刪除**這些字符,而不是用空格替換它們。此外,你應該寫''A''而不是'65'等。 –

+0

我不知道可以使用'A'。 thx爲小費。 – Hjorthenify

+0

...並且你應該正確地格式化你的代碼。 –

3

您可以通過保留兩個索引就地過濾掉字符串中的字符。這是有效的,因爲字符串只能變短,新的字符串將適合舊的內存。下面是如何與兩個指針:

int str_alnum(char *str) 
{ 
    char *p, *q; 

    p = q = str;  
    while (*p) { 
     if (isalnum(*p)) *q++ = *p; 
     p++; 
    } 
    *q = '\0'; 

    return q - str; 
} 

p走原始的字符串,q走新的字符串,p後可能尾隨。 q - str是新字符串的長度,可能與返回值一樣方便。

請注意,您必須傳遞一個可以修改的字符串,即char數組,而不是常量字符串文字。