scanf( ) != EOF,脚本仍在等待进一步输入

scanf( ) != EOF, script still waiting for further input

提问人:Big D Daddy 提问时间:8/7/2020 更新时间:8/7/2020 访问量:218

问:

目前,一旦捕获了所有分离的空间,就试图打破for循环。我在各种页面上花了一个多小时,但是我的代码看起来与我在其他文章中找到的相同。scanf() != EOF 永远不会在我的代码中发生。

int readInput(unsigned char input[], size_t inputMaxLength)
{
    int size = 0; // We want to return the length of the string

    for ( int i = 0; i < inputMaxLength ; i++) { // We only want to capture n amount of chars
        if (scanf("%hhu", (input + i)) != EOF) { // input + i to iterate through the input array
            printf("i = %d , Read %d\n", i , *(input + i)); 
            size++;
        } else {
            return size; // this never occurs which means scanf never == EOF
        }
    }
    return size;
}

输出如下所示,

12 65 98 45 44
i = 0 , Read 12
i = 1 , Read 65
i = 2 , Read 98
i = 3 , Read 45
i = 4 , Read 44

不幸的是,此函数永远不会返回大小,脚本将等待进一步的输入。此外,我必须使用 scanf 来捕获此函数的输入,这是一个约束。

c 扫描 eof

评论

6赞 Barmar 8/7/2020
你是如何运行这个程序的?如果在终端上输入输入,则必须键入控制字符才能发送 EOF。它在 Unix 上是 Control-d,在 Windows 上是 Control-z。
0赞 Sourabh Choure 8/7/2020
条件不是决定何时 for 循环应该中断而不是返回 EOF 吗inputMaxLengthscanf
1赞 chux - Reinstate Monica 8/7/2020
也发布通话代码。一个最小的可重现的例子
1赞 chux - Reinstate Monica 8/7/2020
步骤 1: --> .在无效输入时也退出循环。scanf("%hhu", (input + i)) != EOFscanf("%hhu", (input + i)) == 1
2赞 Jonathan Leffler 8/7/2020
如果您只想要一行输入,请使用 (or POSIX ) 读取该行,然后在循环中使用 sscanf() 从字符串中读取数据。否则,您应该测试返回值 for success (not ),因为如果存在非数字输入,则可以返回 0,或者如果您在终端指示 EOF,则返回 EOF(正如其他人所说)。fgets()getline()scanf() == 1scanf() != EOF

答:

0赞 Aaryan BHAGAT 8/7/2020 #1

如果您从文件中获取输入,那么我想它应该可以正常工作,但是如果您从终端获取输入,那么在键入带有空格的数字(例如)后,您按 Enter,这是一个换行符而不是 EOF。15 20 39\n

对于终端,您遵循一些这样的逻辑

  • 由于最后一件事将永远是 so if do scanf like .<char><newline>scanf("%hhu%c", (input + i), &temp)
  • 然后我们可以标记一个结束条件,如
if (temp == '\n')
{
    // add the last character in the array then break
}

我已经按照上面提到的逻辑,在 onlinegdb.com 上测试了代码(有点多余,你可以稍后清理)

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <stdio.h>
#include<malloc.h>

int readInput(unsigned char input[], size_t inputMaxLength)
{
    int size = 0; // We want to return the length of the string

    for ( int i = 0; i < inputMaxLength; i++) { // We only want to capture n amount of chars
        char c, d;
        scanf("%hhu%c", &c, &d);
        if (d != '\n') { // input + i to iterate through the input array
            *(input + i) = c;
            printf("i = %d , Read %d\n", i , *(input + i)); 
            size++;
        } else {
            *(input + i) = c;
            printf("i = %d , Read %d\n", i , *(input + i)); 
            size++;
            printf("Returning size\n");
            return size; // this never occurs which means scanf never == EOF
        }
    }
    return size;
}

int main()
{
    size_t a = 5;
    unsigned char *input = (char *)malloc(a*sizeof(char));
    printf("%d", readInput(input, a));
    return 0;
}

这是我对测试用例的输出

12 34 5                                                                                                                                                                       
i = 0 , Read 12                                                                                                                                                               
i = 1 , Read 34                                                                                                                                                               
i = 2 , Read 5                                                                                                                                                                
Returning size                                                                                                                                                                
3

评论

0赞 Big D Daddy 8/7/2020
我想你已经找到了解决方案。到目前为止,我的所有输入都已通过终端,我没有检查\n
3赞 chux - Reinstate Monica 8/7/2020
应该返回 1 或更少,是一个问题。最好测试返回值。scanf("%hhu%c", &c, &d);if (d != '\n') {scanf()
0赞 Aaryan BHAGAT 8/7/2020
@chux-恢复莫妮卡 对不起,但我不明白你的意思,为什么我必须检查返回值?scanf()
2赞 chux - Reinstate Monica 8/7/2020
“为什么我必须检查scanf()返回值?” --> 知道它是否成功。如果输入是 ,你期望做什么?"xyz\n"scanf("%hhu%c", &c, &d);
0赞 Shubham 8/7/2020 #2

此块if

if (scanf("%hhu", (input + i)) != EOF) 
{ 
  // input + i to iterate through the input array
  printf("i = %d , Read %d\n", i , *(input + i)); 
  size++;
}

迭代到 将始终为 true。因为将返回,它不等于 .这就是为什么脚本仍在等待进一步输入的原因,我假设如果您在 Windows 或 Linux 上按下了介于 .fori = 0i = inputMaxLengthscanf("%hhu", input+i)1EOF(-1)CTRL+ZCTRL+D0<=i<inputMaxLength

您可以将此代码片段修改为如下所示:

int readInput(unsigned char input[], size_t inputMaxLength)
{
    int size = 0;
    for ( int i = 0; i < inputMaxLength ; i++)
    {
        scanf(" %c", input+i);
        if ( *(input+i) != '\n' )
        {
            printf("i = %d , Read %d\n", i , *(input + i));
            size++;
        }
        else
        {
            return size;
        }
    }
    return size;
}

评论

1赞 Jonathan Leffler 8/7/2020
您应该测试 中的返回值。不清楚用户是否想要读取个位数;示例输入显示正在读取的两位数值,并且无法简单地工作。scanf()%c
0赞 Shubham 8/8/2020
@JonathanLeffler 然后,它将始终返回 1 以成功读取,并且块将在 处执行。如果用户想提前退出循环怎么办?是的,我只是为了简单起见,也是为了删除 gcc 编译器的警告。elsei = inputMazLength-1%c
0赞 Jonathan Leffler 8/8/2020
是的,它将在成功读取时返回 1,如果存在问题(非数字数据或没有更多可用数据),它将返回 0 或 EOF。用户可以通过键入 control-D (Unix) 或 control-Z (Windows) 来指示 EOF。