这里是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");
}
但是,我想分开错误,以便我可以专门发送一条消息,告知它是哪一个。我如何单独进行检查?非常感谢!
答案 0 :(得分: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的建议解析该行。