有没有一种简单的方法可以从字符*中删除特定的字符


char * deleteChars = ""'.“”‘’?:;-,—*($%)! tnx0Ar"

我有这个,我正试图从给定的char*中删除其中的任何一个。我不确定我会如何将一个字符与它进行比较。

例如,如果char*等于"0";你好;我该如何用deleteChars删除逗号?

到目前为止,我有

void removeChar(char*p, char*delim){
char*holder = p;
while(*p){
if(!(*p==*delim++)){
*holder++=*p;
p++;
}
}
*holder = '';

一个简单的逐个方法:

您可以使用strchr来决定该字符是否存在于删除集中。然后在下一个未分配的位置将其重新分配到缓冲区中,前提是不是已过滤的字符。

使用两个索引而不是使用指针算术可能更容易理解这一点。

#include <stdio.h>
#include <string.h>
void remove_characters(char *from, const char *set)
{
size_t i = 0, j = 0;
while (from[i]) {
if (!strchr(set, from[i]))
from[j++] = from[i];
i++;
}
from[j] = 0;
}
int main(void) {
const char *del = ""'.“”‘’?:;-,—*($%)! tnx0Ar";
char buf[] = "hello, world!";
remove_characters(buf, del);
puts(buf);
}

stdout:

hello world

如果有几个分隔符/字符需要忽略,最好使用查找表。

void remove_chars (char* str, const char* delims)
{
if (!str || !delims) return;
char* ans = str;
int dlt[256] = {0};
while (*delims)
dlt[(unsigned char)*delims++] = 1;
while (*str) {
if (dlt[(unsigned char)*str])
++str; // skip it
else //if (str != ans)
*ans++ = *str++;
}
*ans = '';
}

您可以进行双循环,但根据您想要治疗的情况,这可能并不理想。既然你肯定在收缩字符串,你就不需要malloc(前提是它已经被malloc了(。我会初始化这样一个表。

#include <string.h>
...
char del[256];
memset(del, 0, 256 * sizeof(char));
for (int i = 0; deleteChars[i]; i++) del[deleteChars[i]] = 1;

然后在一个函数中:

void delChars(char *del, char *string) {
int i, offset;
for (i = 0, offset = 0; string[i]; i++) {
string[i - offset] = string[i];
if (del[string[i]]) offset++;
}
string[i - offset] = 0;
}

不过,这对字符串文字(使用char* x = ""初始化(不起作用,因为您最终会在程序内存中写入,可能还会出现segfault。如果你需要的话,我相信你可以调整一下。(只需做一些类似char *newString = malloc(strlen(string) + 1); newString[i - offset] = string[i]的事情(

strchr(delim, p[i])应用于p[]中的每个元素。

让我们利用strchr(delim, 0)总是返回一个非NULL指针来消除每个相互关系的空字符测试。

void removeChar(char *p, char *delim) {
size_t out = 0;
for (size_t in; /* empty */; in++) {
// p[in] in the delim set?
if (strchr(delim, p[in])) {
if (p[in] == '') {
break;
}
} else {
p[out++] = p[in];
}
}
p[out] = '';
}

@Oka上的变体很好。

这是一种更好的方法-返回不需要字符的字符串

#include <string.h>
char * remove_chars(char * str, const char * delim) {
for ( char * p = strpbrk(str, delim); p; p = strpbrk(p, delim) )
memmove(p, p + 1, strlen(p));
return str;
}

最新更新