0

我可以知道是否有任何方法可以从 C 中的字符串中删除非字母符号?

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

期望的输出:"hi", "my", "name", "is", "bob"

无论如何要删除符号吗?

4

2 回答 2

3

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

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);

打印

quickbrownfoxjumpsoverthelazydog
于 2012-06-24T10:15:42.953 回答
1

使用 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 编码的。在实践中,我声明的缓冲区大于我计划处理的最大字符串,但我仍然计算被复制的字符,这没有在这里完成。

于 2012-06-24T11:18:45.567 回答