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

时间:2009-12-03 18:04:04

标签: c string

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

4 个答案:

答案 0 :(得分:11)

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

所有提到的功能都在<ctype.h>

中定义

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

答案 1 :(得分: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;
}

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

答案 2 :(得分:5)

在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;
}

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

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

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

答案 3 :(得分:0)

以下是给你答案的简要说明:

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++;
        }
    }
}