2

在这里对 C 来说是全新的。该程序应该在单行上读入一个片段文件,在它们之前和之后用“#”分隔。例如#fragment1##fragment2##fragment3#

我要检查的两个错误是片段不超过 1000 个字符,并且文件遵循片段两侧的正确格式“#”。我真的不明白 fscanf 语法是如何工作的,但我认为以下内容会检查错误:

  char buffer[MAX_FRAG_LEN+1];
  if (fscanf(fp, "#%1000[^#]#", buffer) == 1) {
    return strdup(buffer);
  } else {
    fprintf(stderr, "Error! Incorrect format.\n");
  }

但是,我想将这些错误分开,以便我可以明确地传递一个消息,说明它是两者中的哪一个。如何单独进行支票?非常感激!

4

1 回答 1

1

为了使您的技术发挥作用,您应该手动检查缓冲区之后的下一个字符是否是'#'fscanf返回。这使您可以将过长的字符串错误与丢失的"##"错误区分开来。

  char buffer[MAX_FRAG_LEN+1];
  if (fscanf(fp, "#%1000[^#]", buffer) == 1) {
    int c = fgetc(fp);
    if (c == '#') return strdup(buffer);
    if (c != EOF) {
      ungetc(c, fp);
      fprintf(stderr, "Error! More than 1000 characters.\n");
    } else {
      fprintf(stderr, "Error! Last fragment did not end with '#'.\n");
    }
  } else {
    fprintf(stderr, "Error! Fragment did not start with '#'.\n");
  }

但是,fscanf用于解析通常很棘手。如果输入的格式完全出乎意料,则可能很难从它们中正确恢复。因此,按照 Duck 的建议,通过在单个缓冲区中读取整行然后解析该行通常更容易处理错误。

于 2012-07-10T01:24:44.053 回答