如何在Pascal中用C编写这一行?

时间:2014-04-15 20:03:02

标签: c pascal

我在互联网上找到了一段代码

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));

我不确定那条线......

2 个答案:

答案 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变量并转换它们来使用上述内容。