在 C 中传递带有参数的函数作为回调?

问题描述 投票:0回答:1

我有以下简化代码,我想知道是否可以将参数传递给下面的回调函数:

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

char* foo = "hello!!!!";

bool is_not_char(char x)
{
    bool result = false;
    if (x == '!') result = true;
    
    return !result;
}

void sv_chop_left_while(char* input, size_t count, bool (*predicate)(char x))
{
    size_t i = 0;
    while (i < count && predicate(input[i])) {
        printf(">%c< [%d]\n", input[i], i);
        i += 1;
    }
}

int main(void) {
  sv_chop_left_while(foo, strlen(foo), is_not_char);
}

那么是否可以做这样的事情:

sv_chop_left_while(foo, strlen(foo), is_not_char, '!');

现在,用于比较的字符是硬编码的。我知道这可以通过完全避免 cb 机制来实现,但这是针对此类问题的 POC。

现在的输出看起来像这样:

>h< [0]
>e< [1]
>l< [2]
>l< [3]
>o< [4]

一些参考资料:

原始项目仓库 - https://github.com/tsoding/sv/tree/master

我的 CompilerExplorer 链接 - https://godbolt.org/z/9G8e9sb5M

c callback
1个回答
0
投票

你可以这样做:

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

char* foo = "hello!!!!";

typedef bool (*predicate_t)(char x, char y);

bool is_not_char(char x, char y)
{
    bool result = false;
    if (x == y) result = true;
    
    return !result;
}

void sv_chop_left_while(char* input, size_t count, predicate_t predicate, char y)
{
    size_t i = 0;
    while (i < count && predicate(input[i], y)) {
        printf(">%c< [%d]\n", input[i], i);
        i += 1;
    }
}

int main(void) {
  sv_chop_left_while(foo, strlen(foo), is_not_char, '!');
}
© www.soinside.com 2019 - 2024. All rights reserved.