我刚刚遇到“问题”:是否有一种智能方法可以在字符串中插入文件结尾(ASCII 0)字符?
“聪明”,我指的是比
更好的东西let s = "foo" ^ (String.make 1 (Char.chr 0))
let s = "foo\000"
也就是反映我们正在添加EOF的东西,而不是“ascii值为0的神秘字符”。
修改: 嗯......事实上,我正在弄乱自己是个角色。但无论如何,在C中你可以拥有
#include <stdio.h>
int main(void)
{
char a = getchar();
if (a = EOF)
printf("eof");
else
printf("not eof");
return 0;
}
你可以在哪里测试一个字符是否是一个EOF((int) EOF
是-1
,而不是0
正如我所想的那样。同样,您可以将char设置为EOF等。
我的问题是:是否有可能在ocaml中有类似的东西?
答案 0 :(得分:4)
正如@melpomene所说,没有EOF角色,而且&#39; \ 000&#39;真的只是一个角色。因此,我的问题并没有真正的答案,就像我所知道的那样。
您可以为仅包含NUL字符的字符串定义您自己的名称(就像我们以前称之为):
let eof = "\000"
然后你的功能如下:
let add_eof s = s ^ eof
答案 1 :(得分:1)
你的C有两个错误。首先,您将EOF分配给a
,而不是将a
与EOF进行比较。其次,getchar()
返回一个int。它明确地返回一个int,以便它可以返回EOF,这是一个不能用char表示的值。您的代码(纠正了第一个错误)在测试之前将getchar()
的值赋给char,将无法处理其值为255的char的文件:
$ gcc -Wall getchar.c -o getchar
$ echo -e "\xFF" > fake-eof
$ echo " " > space
$ ./getchar < fake-eof
eof
$ ./getchar < space
not eof
getchar
返回int的技巧,返回一个更大的类型,以便你的返回可以包括较小的类型和其他类型的信息,这是一个技巧,在OCaml中完全没有必要更先进的类型系统。 OCaml可能有
(* using hypothetical c_getchar, a wrapper for the getchar() in C that returns an int *)
let getchar_opt () =
match c_getchar () with
| -1 -> None
| c -> Some (char_of_int c)
let getchar_exn () =
match c_getchar () with
| -1 -> raise End_of_file
| c -> char_of_int c
type `a ior = EOF | Value of 'a
let getchar_ior () =
match c_getchar_ior () with
| -1 -> EOF
| c -> Value (char_of_int c)
当然,OCaml中的Pervasives.input_char
会在EOF上引发异常,而不是执行其他操作。如果你想要一个非特殊的接口,你可以用自己的版本包装input_char
来捕获异常,或者你可以 - 取决于你的程序 - 改为使用Unix.read
,它返回它的字节数能读,在EOF上是0。