提问人:Adi Wiesel 提问时间:5/31/2022 最后编辑:Adi Wiesel 更新时间:5/31/2022 访问量:160
获取 chars 的输入,直到 c 中的 EOF
getting an input of chars until EOF in c
问:
我想扫描字符直到 EOF 并将它们存储在 char 数组中。
我写道:
char current;
int i = 0;
while (scanf(" %c", ¤t) != EOF)
{
arr[i] = current;
i++;
}
//then do some calculations with arr
当我使用此实现测试代码时,它适用于我得到的 4 个输入测试,但未能通过我的助教运行的自动检查。 我想知道它是否与EOF有关。 我应该尝试 while (scanf(“ %c”, ¤t) != 1) 吗?
- 请注意,我只能按照我对 cs 类规则的介绍使用 scanf。
- 超出 arr 的界限在这里不是问题。
编辑:任务是获取一系列字符,直到EOF和打印 以下内容: *总共多少位数字 *最长数字子 *对于每个数字 0-9,打印该数字出现的次数除以总位数 *打印 n x n 矩阵,每个框包含数字 i 在数字 j 之前出现的次数
Example input - 012a"we228228
My output :
Number of digits: 9
Longest digit subsequence: 6
Frequencies: 0.11 0.11 0.56 0.00 0.00 0.00 0.00 0.00 0.22 0.00
Sequential:
0 1 2 8
0 0 1 5 2
1 0 0 5 2
2 0 0 10 8
8 0 0 2 1
问题是这个输出与预期的输出相匹配,但我没有通过我的老师运行的自动测试(使用自动化程序),我不知道为什么。 认为这可能与EOF实施错误有关
答:
0赞
Zakk
5/31/2022
#1
根据 cppreference:
int scanf( const char *format, ... ); int scanf( const char *restrict format, ... ); ...
...
返回值
成功分配的接收参数数(如果在分配第一个接收参数之前发生匹配失败,则可能为零)或 EOF(如果在分配第一个接收参数之前发生输入失败)。
因此,您要求的是获取字符的输入,直到在分配第一个接收参数之前发生输入失败。
您可能要求的可能是获取字符的输入,直到在分配第一个接收参数之前发生匹配失败。在这种情况下,您可能需要执行以下操作:
char current;
int ret;
while ((ret = scanf(" %c", ¤t)) != EOF || ret != 0) {
arr[i] = current;
i++;
}
。但未能通过我的助教进行的自动检查。
你能编辑你的问题并提供自动检查吗?
评论
0赞
Eugene Sh.
5/31/2022
我不认为它提供了这个问题的答案。说明符可能会发生什么样的“匹配失败”?%c
1赞
Weather Vane
5/31/2022
越简单就可以了,同样的想法可以用于任何格式字符串。检查具体的转化次数通常是必不可少的。while (scanf(" %c", ¤t) == 1)
scanf
0赞
Zakk
5/31/2022
@EugeneSh。就我个人而言,我从未遇到过任何匹配角色失败的情况。但是 OP 的代码预计会失败,这是错误的。scanf
0赞
Weather Vane
5/31/2022
如果输入从文件 - EOF 重定向,它将失败。
0赞
Adi Wiesel
5/31/2022
我认为我的帖子缺乏信息,我现在编辑了它,很抱歉.我添加了示例输入和输出
评论
scanf
不返回已读取的字符。它返回扫描的项目数。scanf
EOF
scanf
%s