【发布时间】: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 idea。scanf(" %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_rows和number_of_columns值。最后,使用fflush()是强制性的,并且课程讲师(我只是助教)已经向学生宣布了这一点。 -
@pmg 同样的答案也适用于你,另外,在
fflush()之后,学生也必须使用scanf()。所以我不能使用fgets()。我不想编辑他们的代码。评估需要更多时间。
标签: c windows batch-file scanf command-line-arguments