我尝试在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
?
答案 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之间字母的范围内检查它。