我在互联网上找到了一段代码
int count(const char *needle, const char *stack) {
int n = 0;
const char *p;
if (*stack == 0) return 0;
if (*needle == 0) return 0;
p = strchr(stack, *needle);
if (needle[1] == 0) n += !!p;
if (p) {
n += count(needle + 1, p + 1);
n += count(needle, p + 1);
}
return n;
}
我知道如何重写除1行之外的所有内容,那就是
p = strchr(stack, *needle);
我真的不知道如何以最好的方式做到这一点,我甚至不完全理解它在C中是如何工作的,如果这一行
if (needle[1] == 0) n += !!p;
是
if (needle[1] = 0) then n:=n+ not(not(p));
我不确定那条线......
答案 0 :(得分:0)
strchr( string, character)
查找字符串以查找字符。如果成功则返回指向找到的字符的指针,否则返回NULL - 空指针。
当指针受到布尔否定(感叹号运算符)的影响时,它的行为类似于一个数字,因为空指针的作用为0,而否定给出1,而非空指针否定给出0.另一个布尔否定最终使得原始空指针为0,非空指针为1。
最后,如果needle[1]
为零,则needle
字符串长度为一个字符,如果在stack
字符串中找到该字符,则变量n
会增加1,否则加零。
答案 1 :(得分:0)
在free Pascal中,有一些函数可以管理以null结尾的字符串。从问题陈述中不清楚Pascal中的输入参数是作为Pascal字符串类型进行管理还是以空终止字符串进行管理。要么可以做到。
与strchr
对应的免费Pascal中的函数可能是[strscan][1]
。假设您将count
函数的参数保留为空终止字符串(PChar
类型),那么这样:
const char *p;
p = strchr(stack, *needle);
会变成这样:
var p: PChar;
...
p = strscan(stack, needle^)
此:
if (needle[1] == 0) n += !!p;
会变成这样:
if (needle[1] = 0) and (p <> nil) then Inc(n);
如果count
函数的参数是Pascal字符串,您仍然可以通过声明本地PChar
变量并转换它们来使用上述内容。