我有以下简化代码,我想知道是否可以将参数传递给下面的回调函数:
#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
你可以这样做:
#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, '!');
}