c - 从C中的字符串中过滤出一个字符

标签 c string filter malloc

所以下面是一个函数,它应该从字符串中过滤掉给定的字符 ch,并将过滤后的版本放入结果中。底部的 puts 语句最终输出与原始字符串相同的字符串,而不管过滤后的字符如何,结果最终为空。

void filter_ch_index(char string[], char result[], char ch) {
    result[0] = NUL ; // placeholder
    int i;
    for(i = 0; i < strlen(string); i++)
    {
        if(string[i] != ch)
        {
          result[i] = string[i];
        }
    }
    puts(result);
}

最佳答案

其中一个问题是您的复制逻辑。

当字符不同时,您不会将其复制到result 中,但无论如何您都会增加i。这会在 result 字符串中留下漏洞。要解决这个问题,您可以使用指针(引用和递增)。

我看到的另一个问题是您如何调用该函数。你是否为两者分配了足够的内存空间?

我将放置一个非常不安全的函数实现来展示您如何做到这一点。您应该修改该函数以考虑字符串大小。

#include <stdio.h>

void filter(char *a, char *b, char c)
{
    char *aux = b;
    while(*a) {
        if(*a != c) *b++ = *a;
        a++;
    }
    *b = 0x0; // thx to @PaulRoub for pointing it out
    puts(aux);
}

int main(int argc, char *argv[])
{
    char buffer[100];

    if(argc < 3) {
        printf("Usage: %s <string> <character>\n", argv[0]);
        return 0;
    }

    filter(argv[1], buffer, argv[2][0]);
    return 0;
}

在上面的代码中,aux作为b起始地址的备份。当当前 a 字符不是 \0 时,while 循环将继续(您可以将其读作 while (*a ! = '\0')).条件也很简单。复制部分就是我前面讲的。

如果我们将某些内容复制到其中,我们只会增加 b 字符串,否则,它的引用保持不变。该过程将继续进行,直到循环在 a 字符串中找到 \0 终止字符。

输出:

[ ~/src/test ] $ ./filter "Stack Overflow Questions" e
Stack Ovrflow Qustions
[ ~/src/test ] $ ./filter "Stack Overflow Questions" S
tack Overflow Questions
[ ~/src/test ] $ ./filter "Stack Overflow Questions" s
Stack Overflow Quetion
[ ~/src/test ] $ ./filter "aaa bbb ccc abc cba" a     
 bbb ccc bc cb
[ ~/src/test ] $ ./filter "aaa bbb ccc abc cba" b
aaa  ccc ac ca
[ ~/src/test ] $ ./filter "aaa bbb ccc abc cba" c
aaa bbb  ab ba
[ ~/src/test ] $  

关于c - 从C中的字符串中过滤出一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732029/

相关文章:

c - gcc `-shared` 选项如何影响输出?

c - C程序中的新建和删除

javascript - 根据Typescript中嵌套对象数组的值进行过滤

date - Angular 2 日期管道添加或子小时

php - 如何在 PHP 中获取字符串的最后一个字符?

excel - 如何使用 Google 表格/Excel 中的搜索列表过滤字符串数据?

c - 为什么必须在rust中初始化结构?

c - 为什么++ str和str + 1可以工作而str++不能工作?

string - 用随机数替换文件中的重复数字

java - 将多个编号的对象添加到 ArrayList