提问人:Big D Daddy 提问时间:8/7/2020 更新时间:8/7/2020 访问量:218
scanf( ) != EOF,脚本仍在等待进一步输入
scanf( ) != EOF, script still waiting for further input
问:
目前,一旦捕获了所有分离的空间,就试图打破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 来捕获此函数的输入,这是一个约束。
答:
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 上按下了介于 .for
i = 0
i = inputMaxLength
scanf("%hhu", input+i)
1
EOF(-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 编译器的警告。else
i = inputMazLength-1
%c
0赞
Jonathan Leffler
8/8/2020
是的,它将在成功读取时返回 1,如果存在问题(非数字数据或没有更多可用数据),它将返回 0 或 EOF。用户可以通过键入 control-D (Unix) 或 control-Z (Windows) 来指示 EOF。
下一个:接受未知大小的数组输入
评论
inputMaxLength
scanf
scanf("%hhu", (input + i)) != EOF
scanf("%hhu", (input + i)) == 1
sscanf()
从字符串中读取数据。否则,您应该测试返回值 for success (not ),因为如果存在非数字输入,则可以返回 0,或者如果您在终端指示 EOF,则返回 EOF(正如其他人所说)。fgets()
getline()
scanf() == 1
scanf() != EOF