gpt4 book ai didi

C 到 Delphi/Pascal

转载 作者:行者123 更新时间:2023-12-03 18:11:18 26 4
gpt4 key购买 nike

我需要将一段 C 代码转换为 Delphi/Pascal 代码,但是我无法理解几行代码。

C 代码:

static char* get_boundary(apr_pool_t* p, const char* ctype) {
char* ret = NULL ;
if ( ctype ) {
char* lctype = lccopy(p, ctype) ;
char* bdy = strstr(lctype, "boundary") ;
if ( bdy ) {
char* ptr = strchr(bdy, '=') ;
if ( ptr ) {
// what is the following line supposed to do?
bdy = (char*) ctype + ( ptr - lctype ) + 1;
// and this? I understand it's a loop, but *ptr and ++ptr is ugly!
for ( ptr = bdy; *ptr; ++ptr )
if ( *ptr == ';' || isspace(*ptr) )
*ptr = 0 ;
ret = apr_pstrdup(p, bdy) ;
}
}
}
return ret ;
}

我当前的翻译:

function get_boundary(p: Papr_pool_t; const ctype: PChar): PChar;
var
LCType: PChar;
LBody: PChar;
begin
Result := NIL;
LCType := lccopy(p, ctype);
LBody := strpos(LCType, 'boundary');
if LBody <> NIL then begin
// now what? (:
end; // if LBody <> NIL then begin
end;

lccopy 正在创建 ctype 参数的副本并将其设为小写。

非常感谢有关翻译的一些细节,例如“bdy = (char*) ctype + ( ptr - lctype ) + 1;”和 for 循环。

仅供引用,我正在翻译 mod_upload.c。

最佳答案

        bdy = (char*) ctype + ( ptr - lctype ) + 1;

所以... ( ptr - lctype ) 是指针算法,用于查找 lctype ptr 点的距离。它是指针中保存的地址之间的差异,除以它们指向的数据类型的大小(在本例中为 char,因此大小仅为 1)。

因此 bdy = (char*) ctype + ( ptr - lctype ) + 1;bdy 指向 '=' 之后的字符> 之前找到,但在原始字符串 ctype 中,而不是小写副本 lctype

        for ( ptr = bdy; *ptr; ++ptr )

在 C 中,这并不是一种非常奇怪的遍历字符串的方式。所以当到达终止空字节以结束循环时,*ptr 将测试为 FALSE++ptr 是更多的指针算法,用于移动到指向下一个字符的指针。尽管这看起来很困惑,但这是用 C 语言完成的一种非常自然的方式。

因此循环遍历 bdy 指向的字符串的每个字符,并且在每次迭代期间 *ptr 访问当前字符。

          if ( *ptr == ';' || isspace(*ptr) )
*ptr = 0 ;

循环的目的似乎是在找到的下一个分号或空白字符处终止字符串(通过放置较早的空终止符)。


在字符串操作方面,Delphi 和 C 之间有很大的不同,您最好弄清楚函数在做什么,然后从头开始编写一个 Delphi 等价物,而不是尝试直接这样翻译吧。

看起来该函数在 ctype 中查找“边界”(不区分大小写),然后跳过找到的下一个“=”,并返回从那里到下一个分号的所有内容的副本或空白字符。您可以在 Delphi 中使用 Delphi 字符串和函数轻松地做同样的事情,如果您愿意首先转换字符串,则使用非常不同的代码...

此外,如果重要的话,原始 C 代码似乎忽略了“边界”和“=”之间的任何内容——因此它会接受,比如说,“boundary asdf jidlsah;lkdsf =Value "以及 "boundary=Value"

关于C 到 Delphi/Pascal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9156323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com