Eli*_*sky 11
循环遍历字符串的字符.每当遇到标点符号(ispunct)时,请不要将其复制到输出字符串.每当遇到"alpha char"(isalpha)时,请使用tolower将其转换为小写.
所有提到的功能都在中定义 <ctype.h>
您可以就地执行此操作(通过保留单独的写指针和读取指向字符串的指针),或者从中创建新的字符串.但这完全取决于您的申请.
asv*_*kau 11
只是使用以下提供的函数的算法草图ctype.h:
#include <ctype.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
标准警告适用:完全未经测试; 改进和优化留给读者作为练习.
在C中执行此操作的惯用方法是有两个指针,一个源和一个目标,并分别处理每个字符:例如
#include <ctype.h>
void reformat_string(char *src, char *dst) {
for (; *src; ++src)
if (!ispunct((unsigned char) *src))
*dst++ = tolower((unsigned char) *src);
*dst = 0;
}
Run Code Online (Sandbox Code Playgroud)
src和dst可以是相同的字符串,因为目标永远不会大于源.
尽管它很诱人,但要避免调用,tolower(*src++)因为tolower可能会被实现为宏.
避免使用搜索要替换的字符的解决方案(使用strchr或类似方法),它们会将线性算法转换为几何算法.