从 C 中的字符串中筛选出字符



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

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字符未时,while循环将继续(您可以将其读取为while (*a != ''))。条件也很简单。复制部分是我之前谈到的。

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

输出:

[ ~/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 ] $  

您需要两个索引,一个是要从中读取

的索引,另一个是要写入的索引:
void filter_ch_index(char string[], char result[], char ch)
{
    int j = 0;
    for (int i = 0; string[i] != ''; i++)
    {
        if (string[i] != ch)
            result[j++] = string[i];
    }
    result[j] = ''
    puts(result);
}

这假设result足够大。 请注意,复制函数中参数最常见的顺序是"目标,源"(参见strcpy()memmove(),...),但顺序相反。

请注意,使用原始for(i = 0; i < strlen(string); i++)是一个坏主意。 在循环条件中使用strlen()会将线性算法转换为二次算法,除非您有一个足够复杂的编译器来发现字符串的长度在循环的每次迭代中都不会改变。 (战争故事:从前又一个千年,有一个strstr()的实现,其中包括这样的循环条件。 它在小字符串上工作正常——比如 100 字节以下;当用于 20 KiB 及以上的字符串时,这是一场灾难。 大多数平台都很好——这个平台不是。 该错误早已修复。

请注意,您可以安全地原位修改源字符串;输出字符串永远不会长于源字符串。这样可以避免缓冲区溢出,除非源字符串本身无效(不以 null 结尾)。 void replace_ch(char *string, char ch)是界面。 上面的函数可以用void filter_ch_index(const char string[], char result[], char ch)编写,const指示函数不会修改源字符串。

相关内容

  • 没有找到相关文章

最新更新