检查 fgets() 中不完整的行

问题描述 投票:0回答:1

为了检测它,我看到了以下

if
情况:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
  char line[5];
  while(fgets(line, 5, stdin)){
    int length = strlen(line);
    if (length == 4 && line[3] != '\n') {
      puts("line too long");
      return 1;
    }
  }
  puts("correct file");
  return 0;
}

在这里工作:

$ cc test.c -o test
$ printf '012\n' | ./test
correct file
$ printf '012' | ./test
correct file
$ printf '0123\n' | ./test
line too long

但是当长度等于最大值并且没有尾随换行符时失败:

$ printf '0123' | ./test
line too long

检测不正确,因为整条线都适合缓冲区;文件中没有更多内容可供读取。

c fgets libc
1个回答
0
投票

整条线都适合缓冲区;文件中没有更多内容可供读取。

所以检查一下

if (length == 4 && (line[3] != '\n' || feof(stdin))) {
© www.soinside.com 2019 - 2024. All rights reserved.