0

我正在编写一个程序来执行另一个用 c 编写的程序,这是我的第一次尝试

require 'Open3'

system 'tcc temp.c'

Open3.popen3('temp.exe') do |stdin, stdout, stderr|
   stdin.puts '21\n'
   STDOUT.puts stdout.gets
end

实际输出:

Enter the temperature in degrees fahrenheit: The converted temperature is -6.11

所需的输出:

Enter the temperature in degrees fahrenheit: 21
The converted temperature is -6.11

如果您知道更好的方法,请告诉我,我是 ruby​​ 新手。

4

2 回答 2

1

您似乎至少有两个潜在问题:

  1. 您的换行符不会在单引号内展开。要在字符串中包含换行符,您需要使用双引号,例如"21\n".
  2. 在某些情况下,您实际上需要回车而不是换行。当试图用终端做类似期望的事情时尤其如此。例如,您可能会发现您需要\r而不是\n在您的字符串中。

您肯定需要解决第一件事,但您可能还需要尝试第二件事。这绝对是“您的里程可能会有所不同”的情况之一。

于 2016-02-22T00:08:52.943 回答
1

您似乎希望21出现在屏幕上,因为当您运行temp.exe并输入21. 在这种情况下,它出现在屏幕上的原因是您将它们输入到 shell 中,它会“回显”您输入的所有内容。

但是,当您通过 Ruby 运行程序时,没有 shell,也没有输入,因此21即使它被正确发送到程序的标准输入,也不会出现在屏幕上。

最简单的解决方案非常简单。只需将其写入 Ruby 的标准输出即可:

require 'Open3'

system 'tcc temp.c'

Open3.popen3('temp.exe') do |stdin, stdout, stderr|
  STDOUT.puts "21"
  stdin.puts '"21"
  STDOUT.puts stdout.gets
end

(您会注意到我取出了\n-<code>IO#puts 为您添加了它。)

不过,这有点重复。您可以定义一个简单的方法来为您处理它:

def echo(io, *args)
  puts *args
  io.puts *args
end

然后:

Open3.popen3('temp.exe') do |stdin, stdout, stderr|
  echo(stdin, "21")
  puts stdout.gets
end
于 2016-02-22T00:49:49.720 回答