2014-02-25 122 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数组,而不是常量字符串文字。