如何从C中的String中删除标点符号

我想从字符串中删除所有标点符号并在C中将所有大写字母小写,任何建议?

只是使用ctype.h提供的函数的算法草图:

 #include  void remove_punct_and_make_lower_case(char *p) { char *src = p, *dst = p; while (*src) { if (ispunct((unsigned char)*src)) { /* Skip this character */ src++; } else if (isupper((unsigned char)*src)) { /* Make it lowercase */ *dst++ = tolower((unsigned char)*src); src++; } else if (src == dst) { /* Increment both pointers without copying */ src++; dst++; } else { /* Copy character */ *dst++ = *src++; } } *dst = 0; } 

标准警告适用:完全未经测试; 改进和优化留给读者作为练习。

循环遍历字符串的字符。 每当遇到标点符号( ispunct )时,请不要将其复制到输出字符串。 每当遇到“alpha char”( isalpha )时,请使用tolower将其转换为小写。

所有提到的函数都在中定义

您可以就地执行此操作(通过保留单独的写指针和读取指向字符串的指针),或者从中创建新的字符串。 但这完全取决于您的申请。

在C中执行此操作的惯用方法是使用两个指针,一个源和一个目标,并分别处理每个字符:例如

 #include  void reformat_string(char *src, char *dst) { for (; *src; ++src) if (!ispunct((unsigned char) *src)) *dst++ = tolower((unsigned char) *src); *dst = 0; } 

src和dst可以是相同的字符串,因为目标永远不会大于源。

虽然它很诱人,但请避免调用tolower(*src++)因为tolower可以实现为宏。

避免使用搜索要替换的字符的解决方案(使用strchr或类似方法),它们会将线性算法转换为几何算法。

这是给你一个粗略的答案:

 void strip_punct(char * str) { int i = 0; int p = 0; int len = strlen(str); for (i = 0; i < len; i++) { if (! ispunct(str[i]) { str[p] = tolower(str[i]); p++; } } }