获取文本而不是 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 起作用。

有人知道问题出在哪里吗?

要检测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] = '[=11=]';  // add
puts(testo);

您错误地测试了 EOF。使用 scanf(),您需要查看 return 值。事实上,对于几乎所有的输入函数,如果不捕获和测试,你需要测试 return 值。

从表面上看,您需要:

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() 将 return 0,而不是 EOF。

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

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

然而,使用 scanf 从输入流中一次读取一个字节是多余的。在 C 中执行此操作的惯用方法是使用 getchar()getc() 函数。 return 值必须存储在 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] = '[=10=]';

    puts(testo);
    return 0;
}