【问题标题】:How to pass values to scanf() via Windows batch file如何通过 Windows 批处理文件将值传递给 scanf()
【发布时间】:2020-02-17 12:59:04
【问题描述】:

我想快速给学生的硬件评分,所以我决定为此编写一个批处理脚本。我知道在 Ubuntu 中这样做更容易,但由于学生需要在 Windows 中编写他们的硬件,我也必须在 Windows 中评估它们。好吧,到目前为止,我编写了以下批处理文件,但它没有使用 char 变量。

请注意,硬件的目的是绘制一个矩形并用键盘给出的字符(scanf)填充它

@echo off
set file=%1
gcc %file% -o %file%.exe
REM Followings are "row col fill" respectively
echo 6 10 A | %file%.exe :: #1
echo 6 6   | %file%.exe :: #2
move %file% graded\
move %file%.exe graded\

在这里,在 #1 和 #2 处,它都会绘制带有空格的矩形,但是在 #1 处它应该用As 填充它。

如果我的学生可以在网上找到这个问题,我不能把整个解决方案放在这里,但我可以显示scanf() char 部分:

//take num_of_rows and num_of columns
....
printf("\nFilling char?: ");
fflush(stdin);
scanf("%c",&fill);
...
//draw rectangle

最后,这是所需的输出:

TEST-1
Enter number of rows (between 3-20) : 5
Enter number of columns (between 3-80) : 40
Enter a filling character (one char) : #
 +--------------------------------------+
 |######################################|
 |######################################|
 |######################################|
 +--------------------------------------+
TEST-2
Enter number of rows (between 3-20) : 8
Enter number of columns (between 3-80) : 25
Enter a filling character (one char) : (blank)
 +-----------------------+
 |                       |
 |                       |
 |                       |
 |                       |
 |                       |
 |                       |
 +-----------------------+

警告:请不要放完整的C代码解决方案,因为它是一个硬件。

【问题讨论】:

  • 没有minimal reproducible example,将很难为您提供帮助。但是fflush(stdin); 不是good ideascanf(" %c",&fill); 或许可以胜任这项工作。
  • fflush(stdin); 可能会丢弃您输入的所有内容。您可以使用scanf("%d %d %c", &row, &column, &fill);
  • 当您依次提供"6 10 A"scanf("%d")scanf("%d")scanf("%c") 时...第一个将捕获缓冲区中留下" 10 A" 的6 个;第二个将捕获 10 个在缓冲区中留下 " A" 的空间,第三个将捕获在缓冲区中留下 "A" 的空间。 使用fgets() 进行用户输入
  • @mch 和 fflush() 如果我单独执行二进制文件(没有批处理文件),它可以完美地工作,但是,使用批处理文件,它仍然可以正确绘制矩形,但不会用给定值。所以这意味着传递这样的参数应该不是问题,因为即使我们使用 3 个不同的 scanf(),它也需要 number_of_rowsnumber_of_columns 值。最后,使用fflush() 是强制性的,并且课程讲师(我只是助教)已经向学生宣布了这一点。
  • @pmg 同样的答案也适用于你,另外,在fflush() 之后,学生也必须使用scanf()。所以我不能使用fgets()。我不想编辑他们的代码。评估需要更多时间。

标签: c windows batch-file scanf command-line-arguments


【解决方案1】:

由于我这里没有正在运行的 Windows,也不知道作业的其余解决方案是什么样的,这可能会也可能不会起作用。 fflush(stdin) 可能只清除当前输入 line 而不是完整输入。

您说过(在 cmets 中)您的示例解决方案无需批处理即可工作。

然后您可能想尝试将输入放在输入文件的单独行中,该输入文件将被馈送到家庭作业程序中:

echo.6>   input.txt
echo.10>> input.txt
echo.A>>  input.txt
%file%.exe < input.txt

echo.6>  input.txt
echo.6>> input.txt
echo. >> input.txt
%file%.exe < input.txt

echo 命令必须按字面意思显示,当然您会改变行、列和填充字符。

一些注意事项:

  • echo 之后的点使它认为给出了一个参数。特别是在显示的最后一个命令中,否则只会输出“Echo is ON”(或 OFF)。

  • 如果您不希望在输入中的数字后面有一个,则行/列号后面不应有空格。

  • 在相应的第三条命令中,echo.&gt;&gt; input.txt 之间只有一个字符。这是填充字符“A”和空格。

  • 您可以省略&gt;&gt; 和文件名input.txt 之间的空格。这只是为了清楚。

  • 以防万一您不知道:&gt; 在写入之前清除输出文件; &gt;&gt; 将附加到它。

【讨论】:

  • 实际上它没有用,但这是这里唯一的答案。我通过在使用 powershell 的“查找和替换”功能进行编译之前编辑 .c 文件解决了我的问题,因此我将 fflush 替换为 //fflush,如下所示:stackoverflow.com/questions/60034/…
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多