Ocaml 比较不起作用
Ocaml comparison not working
我正在尝试用 Ocaml 编写一个简单的服务器程序,它通过套接字与其他进程通信。我目前有一个问题,即服务器读取的字符串(使用 input_line ic
)似乎无法与其他字符串正确比较。例如,我 运行 服务器程序并使用 telnet 连接到它,如果我将“end”作为一行发送,服务器程序会尝试匹配“end”,但这并不像预期的那样工作。处理通信的函数是 service
(如下),它被调用来处理作为分叉服务器一部分的客户端(类似于双分叉处理 here)。
let service ic oc
try while true do
let instr = input_line ic in
match instr with
| "end" -> print_endline "matching end" (* this never runs *)
| _ -> output_string oc ((String.uppercase instr) ^ "\n") ; flush oc
done
with End_of_file -> print_endline "Input stream ended."
;;
事实上,如果我这样做 print_endline (string_of_bool ("end" = instr))
,我总是得到 false(即使我通过 telnet 发送“结束”)。为了尝试了解发生了什么,我打印了 let-binding 和 try 块之间不同比较操作的结果:
print_endline instr ;
print_endline "end" ;
print_endline (string_of_bool ("end" = instr)) ;
print_endline (string_of_bool ("end" == instr)) ;
print_endline (string_of_int (String.compare "end" instr)) ;
当我发送“结束”时,服务器现在打印出来
end
end
false
false
-1
我真的不知道会发生什么 - 我想这一定是关于通过从套接字读取 instr
的事情,因为通常你可以很好地比较字符串。
我认为我在所有这些背景下实际上没有问题,所以这里有一些可行的变体:
- 我做错了什么?
- 为什么我不能测试输入以执行不同的操作?
- 这是 Ocaml 中的错误吗?
- 您需要完整的源代码来解决这个问题吗?
我的猜测是telnet进来的字符串中有回车符returns。我记得,旧协议倾向于在行尾发送 CRLF。
您可以尝试使用 String.escaped
打印字符串。
您在 OCaml 中发现错误的可能性很小。
我正在尝试用 Ocaml 编写一个简单的服务器程序,它通过套接字与其他进程通信。我目前有一个问题,即服务器读取的字符串(使用 input_line ic
)似乎无法与其他字符串正确比较。例如,我 运行 服务器程序并使用 telnet 连接到它,如果我将“end”作为一行发送,服务器程序会尝试匹配“end”,但这并不像预期的那样工作。处理通信的函数是 service
(如下),它被调用来处理作为分叉服务器一部分的客户端(类似于双分叉处理 here)。
let service ic oc
try while true do
let instr = input_line ic in
match instr with
| "end" -> print_endline "matching end" (* this never runs *)
| _ -> output_string oc ((String.uppercase instr) ^ "\n") ; flush oc
done
with End_of_file -> print_endline "Input stream ended."
;;
事实上,如果我这样做 print_endline (string_of_bool ("end" = instr))
,我总是得到 false(即使我通过 telnet 发送“结束”)。为了尝试了解发生了什么,我打印了 let-binding 和 try 块之间不同比较操作的结果:
print_endline instr ;
print_endline "end" ;
print_endline (string_of_bool ("end" = instr)) ;
print_endline (string_of_bool ("end" == instr)) ;
print_endline (string_of_int (String.compare "end" instr)) ;
当我发送“结束”时,服务器现在打印出来
end
end
false
false
-1
我真的不知道会发生什么 - 我想这一定是关于通过从套接字读取 instr
的事情,因为通常你可以很好地比较字符串。
我认为我在所有这些背景下实际上没有问题,所以这里有一些可行的变体:
- 我做错了什么?
- 为什么我不能测试输入以执行不同的操作?
- 这是 Ocaml 中的错误吗?
- 您需要完整的源代码来解决这个问题吗?
我的猜测是telnet进来的字符串中有回车符returns。我记得,旧协议倾向于在行尾发送 CRLF。
您可以尝试使用 String.escaped
打印字符串。
您在 OCaml 中发现错误的可能性很小。