我希望fscanf可以识别潜在的溢出时间,并且我无法理解如何做到这一点。
例如,对于包含字符串
的文件**a**bb**cccc**
我做了
char str[10];
while (fscanf(inputf, "*%10[^*]*", str) != EOF) {
}
因为我保证**和**之间的差距通常小于10.但有时我可能会得到一个
**a**bb**cccc*
(没有最后一个*)甚至可能是缓冲区溢出。
我考虑过使用
while (fscanf(inputf, "*%10[^*]", str) != EOF) {
}
(没有最后的*)甚至
while (fscanf(inputf, "*%10s*", str) != EOF) {
}
但这将返回整个字符串。我试着看看我是否可以检查是否存在*,但我无法让它工作。我也见过fgets的实现,但我宁愿不要让它变得复杂。有什么想法吗?
答案 0 :(得分:2)
虽然fscanf()
似乎被设计为通用表达式解析器,但很少有程序员依赖于这种能力。相反,使用fgets()
读取文本行,然后使用您选择或设计的解析器来剖析文本缓冲区。
使用fgets()的全部功能在不同的实现上是狡猾的,并不总是提供完整的功能,甚至也没有正确实现。
答案 1 :(得分:2)
我不清楚你想要什么。是跳过任意数量的星星,然后将最多9个非星形字符读入缓冲区?如果是这样,试试这个:
void read_field(FILE *fin, char buf[10])
{
int c;
char *ptr = buf;
while ((c = getc(fin)) == '*')
/*continue*/;
while (c != '*' && c != EOF && ptr < buf+9)
{
*ptr++ = c;
c = getc(fin);
}
*ptr = '\0';
/* skip to next star here? */
}
您会注意到我没有使用fscanf
。那是因为fscanf
几乎总是比它的价值更麻烦。以上是更多的打字,但我可以确信它是我所描述的那样。