删除字符串中的字符?

时间:2014-02-25 07:36:28

标签: c string if-statement

我尝试在google上搜索它并且找不到简单的答案,大多数问题是要求从字符串中删除所有出现的字符串而不是。

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

3 个答案:

答案 0 :(得分:3)

通常,您将构建第二个数组并将有效符号复制到该数组。

仅当您将所有尾随数字向下移动一步时,才能删除数组内的数字,这是非常低效的。如果您需要一个容器类,您可以轻松地在中间删除和添加项目,那么您应该使用linked list

您可以将isalnum的返回值视为bool类型。因此

if ( !isalnum(string[e]) )

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

很好,完全等同。

答案 1 :(得分: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数组,而不是常量字符串文字。

答案 2 :(得分: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';

它基本上是这样做的,它将字母转换为相应的整数,然后在代表A-Z,a-z和1-9之间字母的范围内检查它。

相关问题