【问题标题】:C: Remove symbols from a stringC:从字符串中删除符号
【发布时间】:2012-06-25 22:35:21
【问题描述】:

请问有没有办法从 C 中的字符串中删除非字母符号?

例如,我有一个char array[5][5] 与:"hi", "my..", "name", "is,,", "bob!"

所需输出:"hi", "my", "name", "is", "bob"

还有没有去掉符号?

【问题讨论】:

  • 是的,有办法。我建议您在向 SO 提问之前努力去做,看看您想出了什么,这样做的目的不是为您编写代码。但是,为了帮助您,请查看 ctype.h
  • 顺便说一句,这是stackoverflow.com/questions/6433866/… 的副本,我通过搜索 [c] alphanumeric 找到了它

标签: c arrays string symbols


【解决方案1】:

这是一个非常简单的实现:

void keepalnum(char *src) {
    unsigned char *dest = src;
    while ((*dest = *src++))
        dest += isalnum(*dest) ? 1 : 0;
}

这个想法是在每次复制后推进源指针,但只有在看到字母数字字符时才移动目标指针。

这是你如何使用它:

char str[] = "quick-brown fox jumps? over the.. lazy dog!";
keepalnum(str);
printf("%s\n", str);

这个prints

quickbrownfoxjumpsoverthelazydog

【讨论】:

  • 这当然不是我会提供给新手的那种代码……也不是我自己写的那种代码。它甚至是错误的,因为永远不应该将 char 传递给 isalnum。更直接,没有额外的存储和错误是(对不起,没有格式):unsigned char c; while ( (c = *src++) != '\0' ) if(isalnum(c)) *dest++ = c; *dest = '\0';
  • @JimBalter 我的解决方案与 K&R 的书第五章中 strcpy 的最新版本没有太大区别。我相信任何希望在 C 中进行任何类型编程的人都需要对 K&R 非常熟悉。但我试图避免将标准设置得太高:例如,在我的代码中,我更喜欢 dest += !!isalnum(*dest) 而不是三元运算符,但一口气消化太多了。
  • 在 K&R 的第一版出版之前,我就一直在编写 C 代码。这是一个很好的资源,但不是关于编码技术的最终决定。而且你的代码不会通过我的审查甚至我的面试。
  • @JimBalter 我能说什么......我想我应该很高兴我没有将我的代码提交给你进行审查:) 至于所谓的错误,你介意提供一个示例我的代码会失败的字符串?
  • 哎呀,我没有看到指针别名 ;-) 它比我的更微不足道。您不也添加 register 关键字,只是为了取悦@JimBalter :-?顺便说一句,对于 wakkerbot,我通过将 is...() 包装成一堆丑陋的宏来解决这个问题。我想我后来删除了它们。
【解决方案2】:

使用 C isalnum(int ch);,您可以像这样删除既不是数字也不是字符的过滤器值:

#include <stdio.h>
#include <string.h>

#define ARRAY_LEN 5
#define STR_LEN 5

int main(int argc, char *argv[])
{
    int rc = 0;

    char array[5][5];
    char out_str[5] = {0};

    int array_idx, str_idx, cpy_idx;

    strcpy(array[0], "hi");
    strcpy(array[1], "my..");
    strcpy(array[2], "name");
    strcpy(array[3], "is,,");
    strcpy(array[4], "bob!");

    for(array_idx=0; array_idx < ARRAY_LEN; array_idx++)
    {
        cpy_idx = 0;

        for(str_idx=0; str_idx < STR_LEN; str_idx++)
        {
            if(isalnum(array[array_idx][str_idx]))
            {
                out_str[cpy_idx++]= array[array_idx][str_idx];
            }
        }

        out_str[cpy_idx++] = '\0';
        printf("%s ", out_str);
    }

    printf("\n");

    return rc;
}

这个例子缺少结束边界检查,因为这个例子是围绕 4 个字符的字符串加上一个终止 0 编码的。在实践中,我声明的缓冲区大于我计划处理的最大字符串,但我仍然计算字符复制的,这里没有做。

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 2017-03-19
    • 2016-11-22
    • 2013-05-19
    • 2022-01-09
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多