如何在保存字符之前阻止程序跳过字符

时间:2019-03-27 12:00:02

标签: c file-io

我正在制作一个简单的程序,逐个字符地读取文件,将它们放入tmp,然后将tmp放入input [i]。但是,程序将一个字符保存在tmp中,然后将下一个字符保存在input [i]中。如何使其不跳过第一个字符?

我试图立即读入input [i],但是后来我无法检查EOF标志。

FILE * file = fopen("input.txt", "r");
char tmp;
char input[5];
tmp= getc(file);
input[0]= tmp;
int i=0;
while((tmp != ' ') && (tmp != '\n') && (tmp != EOF)){
    tmp= getc(file);
    input[i]=tmp;
    length++;
    i++;
}
printf("%s",input);

应该打印“ ADD $ 02”,但打印“ DD 02”。

1 个答案:

答案 0 :(得分:0)

您正在按照错误的顺序执行代码:代码的结构,读取和存储第一个字符的方式已移出循环。在循环中,该字符随后被覆盖。在这种情况下,请以i = 1开头。

也许您仍然想读取第一个字符,但是我想您想读取所有内容,直到第一个空格为止,这可能是第一个字符。然后执行以下操作:

#include <stdio.h>

int main(void)
{
    char input[80];
    int i = 0;
    int c = getchar();

    while (c != ' ' && c != '\n' && c != EOF) {
        if (i + 1 < sizeof(input)) {         // store char if the is room
            input[i++] = c;
        }

        c = getchar();
    }

    input[i] = '\0';                         // null-terminate input

    puts(input);

    return 0;
}

注意事项:

  • 在循环之前读取第一个字符。循环条件和存储char的代码将使用该char。在循环体结束之前,将读取下一个字符,然后将在下一个迭代中对其进行处理。

  • 您不强制要求char缓冲区input不能被覆盖。这很危险,尤其是因为您的缓冲区很小。

  • 在按字符构造字符串char时,应通过在末尾放置一个显式'\0'来以空值终止。您必须确保该终结器有空间。几乎所有的系统功能,例如putsprintf("%s", ...)都希望字符串以空值结尾。

  • 使getchar的结果为int,以便您可以区分所有有效的字符代码和特殊值EOF

如果获取下一个项目的第一个调用和后续调用不同,例如使用strtok标记字符串时,上面的代码很有用。在这里,您还可以选择另一种方法:

    while (1) {                          // "infinite loop" 
        int c = getchar();               // read a char first thing in a loop

        if (c == ' ' || c == '\n' || c == EOF) break;
                                         // explicit break when done

        if (i + 1 < sizeof(input)) {
            input[i++] = c;
        }
    }

这种方法具有仅在循环体内处理字符的逻辑,但是必须将其包装在无限循环中,然后使用显式break