获取 chars 的输入,直到 c 中的 EOF

getting an input of chars until EOF in c

提问人:Adi Wiesel 提问时间:5/31/2022 最后编辑:Adi Wiesel 更新时间:5/31/2022 访问量:160

问:

我想扫描字符直到 EOF 并将它们存储在 char 数组中。

我写道:

char current;
int i = 0;
while (scanf(" %c", &current) != EOF)
{
arr[i] = current;
i++;
}
//then do some calculations with arr

当我使用此实现测试代码时,它适用于我得到的 4 个输入测试,但未能通过我的助教运行的自动检查。 我想知道它是否与EOF有关。 我应该尝试 while (scanf(“ %c”, &current) != 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实施错误有关

c 扫描 eof

评论

2赞 Jeff Holt 5/31/2022
scanf不返回已读取的字符。它返回扫描的项目数。
1赞 Gerhardh 5/31/2022
@JeffHolt程序不依赖于返回输入值,而是依赖于返回,如果不再输入数据。scanfEOF
1赞 Eugene Sh. 5/31/2022
@JeffHolt 这不是误会......它在 EOF 上返回 EOF。
2赞 Lundin 5/31/2022
啊,对了,没关系......一如既往,咖啡太少了。
1赞 Weather Vane 5/31/2022
@EugeneSh。当输入第一个非空格字符时,筛选器将完成,因为筛选器会删除所有空格,并且在输入非空格之前无法知道。格式字符串中的尾随空格是不可取的。您可以在使用 format 时看到这一点,在输入非空行之前不会返回。scanf%s

答:

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", &current)) != EOF || ret != 0) {
    arr[i] = current;
    i++;
}

但未能通过我的助教进行的自动检查。

你能编辑你的问题并提供自动检查吗?

评论

0赞 Eugene Sh. 5/31/2022
我不认为它提供了这个问题的答案。说明符可能会发生什么样的“匹配失败”?%c
1赞 Weather Vane 5/31/2022
越简单就可以了,同样的想法可以用于任何格式字符串。检查具体的转化次数通常是必不可少的。while (scanf(" %c", &current) == 1)scanf
0赞 Zakk 5/31/2022
@EugeneSh。就我个人而言,我从未遇到过任何匹配角色失败的情况。但是 OP 的代码预计会失败,这是错误的。scanf
0赞 Weather Vane 5/31/2022
如果输入从文件 - EOF 重定向,它将失败。
0赞 Adi Wiesel 5/31/2022
我认为我的帖子缺乏信息,我现在编辑了它,很抱歉.我添加了示例输入和输出