Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 从字符串中读取整数_String_Ocaml - Fatal编程技术网

String 从字符串中读取整数

String 从字符串中读取整数,string,ocaml,String,Ocaml,我想从文件中读取一行,从该行初始化数组,然后显示整数。 为什么不读取行中的五个整数?我想得到输出12345,我有1111 open Array;; open Scanf;; let print_ints file_name = let file = open_in file_name in let s = input_line(file) in let n = ref 5 in let arr = Array.init !n (fun i -> if i < !n

我想从文件中读取一行,从该行初始化数组,然后显示整数。
为什么不读取行中的五个整数?我想得到输出
12345
,我有
1111

open Array;;
open Scanf;;

let print_ints file_name = 
  let file = open_in file_name in
  let s = input_line(file) in
  let n = ref 5 in
  let arr = Array.init !n (fun i -> if i < !n then sscanf s "%d" (fun a -> a) else 0) in
  let i = ref 0 in 
  while !i < !n do
    print_int (Array.get arr !i);
    print_string " ";
    i := !i + 1;
  done;;

print_ints "string_ints.txt";;
开放数组;;
开放扫描;;
让打印文件名=
让file=open\u in file\u name in
设s=输入中的行(文件)
设n=ref 5 in
让arr=Array.init!n(乐趣i->如果i<!n则sscanf s“%d”(乐趣a->a)否则0)在
设i=ref0 in
虽然我!n do
print_int(Array.get arr!i);
打印字符串“”;
我:=!i+1;
完成;;
打印_ints“string_ints.txt”;;

我的文件是:
123445

您可能想尝试以下方法。将字符串拆分为表示数字的子字符串列表。描述了执行此操作的一种方法。然后在
print_ints
函数中使用生成的函数

let ints_of_string s = 
  List.map int_of_string (Str.split (Str.regexp " +") s)

let print_ints file_name = 
  let file = open_in file_name in
  let s = input_line file in
  let ints = ints_of_string s in
  List.iter (fun i -> print_int i; print_char ' ') ints;
  close_in file

let _ = print_ints "string_ints.txt"
编译时,将
str.cma
str.cmxa
作为参数传递(有关编译的详细信息,请参阅):

另一种选择是使用
Scanf.bscanf
函数--,其中包含一个示例(小心使用)

Scanf.sscanf
功能可能并不特别适合此任务。 摘自:

scanf工具不适用于繁重的词法分析和解析。如果它的表达能力不足以满足您的需要,那么有几种替代方法:正则表达式(modulestr)、流解析器、ocamlex生成的lexer、ocamlyacc生成的解析器

但是有一种方法可以使用
Scanf.sscanf
解析一个int字符串(我不推荐):


这里的技巧是将输入字符串
s
表示为将被解析为整数(
%d
)的一部分,并使用范围格式表示字符串的其余部分:
%[0-9-+]“
,它将匹配字符串的其余部分,只包含十进制数字
0-9
-
+
符号,以及空格

为什么不读取行中的五个整数?我想得到输出1 2 3 4 5,我有11111它是这个部分
sscanf s“%d”(fun a->a)
:你总是从一开始就扫描同一个字符串
s
sscanf
不会更改您的字符串。那么,如何从字符串中获取所有整数?字符串中有int\u,但这会尝试将整个字符串转换为一个数字。还有get,但这只会给我char而不是整数。这就解决了问题。Ocaml对于地图之类的东西非常强大,但是对于扫描来说,使用外部的东西似乎是有限的。使用sscanf我能做到吗?似乎我总是需要知道格式有多少整数。
Str
是一个标准模块(不是外部模块),只是编译有点复杂。是的,你必须修正你的格式字符串(我更新了答案以反映这一点)。你可能会喜欢这个。您可以在这里使用streams
let int_stream_of_string s=stream.of_list(list.map int_of_string(Str.split(Str.regexp“+”)s))
以逐段方式处理字符串。您的拆分不会处理负数。@vanmarcke我添加了一个带有
sscanf
的示例。
$ ocamlc str.cma print_ints.ml
let rec int_list_of_string s =
  try
    Scanf.sscanf s 
                 "%d %[0-9-+ ]" 
                 (fun n rest_str -> n :: int_list_of_string rest_str)
  with
    | End_of_file | Scanf.Scan_failure _ -> []