提问人:Fabio 提问时间:12/6/2015 最后编辑:Jonathan LefflerFabio 更新时间:12/6/2015 访问量:108
获取文本,而不获取 EOF
Get text while not EOF
问:
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 256
int main(int argc, const char * argv[]) {
char testo[N];
int i;
printf("PER TERMINARE L'INSERIMENTO PREMERE CTRL+Z oppure CTRL+D \n");
for(i=0;i<N;i++)
{
scanf("%c",&testo[i]);
/* if(testo[i]=='h' && testo[i-1]=='c')
{
i--;
testo[i]='k';
}
if(testo[i]==testo[i-1])
{
i--;
} */
if(testo[i]==EOF)
{
break;
}
}
puts(testo);
return 0;
}
编译代码时,我无法停止使用 EOF 插入文本,但是当代码生成并运行时,EOF 可以正常工作。/* ... */
有谁知道问题出在哪里?
答:
1赞
chux - Reinstate Monica
12/6/2015
#1
要检测 ,请检查EOF
scanf()
if scanf("%c",&testo[i]) == EOF) break;
注意:不能以 null 字符结尾。要打印为字符串,请确保它是字符串。testo[]
char testo[N];
int i;
// for(i=0;i<N;i++) {
for(i=0;i<(N-1);i++) {
if (scanf("%c",&testo[i]) == EOF) break;
}
testo[i] = '\0'; // add
puts(testo);
2赞
Jonathan Leffler
12/6/2015
#2
您测试的 EOF 不正确。使用 ,您需要查看返回值。事实上,对于几乎所有的输入函数,您都需要测试(如果不是捕获和测试)返回值。scanf()
从表面上看,您需要:
for (i = 0; i < N; i++)
{
if (scanf("%c", &testo[i]) == EOF)
break;
…
}
但是,一般来说,您应该检查是否进行了与要求一样多的成功转换,因此最好写:scanf()
for (i = 0; i < N; i++)
{
if (scanf("%c", &testo[i]) != 1)
break;
…
}
在这个例子中,这真的无关紧要。但是,如果您正在读取数值数据,那将很重要。用户可能会键入而不是数字,并且将返回 0,而不是 EOF。Z
scanf()
0赞
chqrlie
12/6/2015
#3
若要在文件末尾停止,请检查以下值:scanf
scanf
返回正确解析的输入数。在您的情况下,只要尚未到达文件末尾,就可以正确地从流中读取字节。 会做。%c
if (scanf("%c",&testo[i]) != 1) break;
然而,使用一次从输入流中读取一个字节是矫枉过正的。在 C 语言中执行此操作的惯用方法是使用 or 函数。返回值必须存储在变量中,并在文件结束时具有特殊值。scanf
getchar()
getc()
int
EOF
您还应该将数组延长 1 个字节,并在末尾存储一个 null 字节,使其成为 C 字符串,正如 所预期的那样。puts
下面是程序的修改版本:
int main(int argc, const char *argv[]) {
char testo[N+1];
int i;
printf("PER TERMINARE L'INSERIMENTO PREMERE CTRL+Z oppure CTRL+D\n");
for (i = 0; i < N; i++) {
int c = getchar();
if (c == EOF)
break;
testo[i] = c;
/* ... further processing ... */
}
testo[i] = '\0';
puts(testo);
return 0;
}
评论
getline
fgets
if (testo[i] == EOF)
巧合的是类型类型是有符号的。它还会在读取字符时错误地检测到文件末尾。char
\377