在没有EOF的情况下获取文本

时间:2015-12-05 19:52:14

标签: c string text char eof

这是我的代码:

std::make_heap()

编译#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可以正常工作。

有谁知道问题是什么?

3 个答案:

答案 0 :(得分: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;
    …
}

在这个例子中,它确实无关紧要。但是,如果您正在阅读数字数据,那就很重要了。用户可能会输入Z而不是数字,scanf()将返回0,而不是EOF。

答案 1 :(得分:1)

要检测EOF,请检查scanf()

的结果
if scanf("%c",&testo[i]) == EOF) break;

注意: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 :(得分:0)

要在文件末尾停止,请检查scanf的返回值:

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

然而,使用scanf一次从输入流中读取一个字节是过度的。在C中执行此操作的惯用方法是使用getchar()getc()函数。返回值必须存储在int变量中,并且在文件末尾具有特殊值EOF

你应该使数组长1个字节,并在末尾存储一个空字节,使其成为一个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;
}