获取文本,而不获取 EOF

Get text while not EOF

提问人:Fabio 提问时间:12/6/2015 最后编辑:Jonathan LefflerFabio 更新时间:12/6/2015 访问量:108

问:

这是我的代码:

#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 可以正常工作。/* ... */

有谁知道问题出在哪里?

C 字符串 文本 字符 EOF

评论

0赞 Basile Starynkevitch 12/6/2015
更好的是,使用或至少阅读整行getlinefgets
0赞 chqrlie 12/6/2015
if (testo[i] == EOF)巧合的是类型类型是有符号的。它还会在读取字符时错误地检测到文件末尾。char\377

答:

1赞 chux - Reinstate Monica 12/6/2015 #1

要检测 ,请检查EOFscanf()

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。Zscanf()

0赞 chqrlie 12/6/2015 #3

若要在文件末尾停止,请检查以下值:scanf

scanf返回正确解析的输入数。在您的情况下,只要尚未到达文件末尾,就可以正确地从流中读取字节。 会做。%cif (scanf("%c",&testo[i]) != 1) break;

然而,使用一次从输入流中读取一个字节是矫枉过正的。在 C 语言中执行此操作的惯用方法是使用 or 函数。返回值必须存储在变量中,并在文件结束时具有特殊值。scanfgetchar()getc()intEOF

您还应该将数组延长 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;
}