while (fscanf(update, "%*[^0-9]%d", ¤tIn->userid) == 1)
{
...
}
这会跳过非数字(即%*[^0-9]
部分),后跟一个整数。不计算被抑制的分配,因此== 1
确保您得到一个数字。
不幸的是,如果文件中的第一个字符是数字,就会遇到问题——正如Chris Dodd所指出的那样。有多种可能的解决方案:
ungetc('a', update);
会先给出一个非数字来读取。
while ((fscanf(update, "%*[^0-9]"), fscanf(update, "%d", ¤tIn->userid)) == 1)
或者:
while (fscanf(update, "%*[^0-9]%d", ¤tIn->userid) == 1 ||
fscanf(update, "%d", ¤tIn->userid) == 1)
{
...
}
根据您认为哪个更有可能,您可以颠倒这两个fscanf()
策略的顺序。对于scanf()
函数族,如果数字字符串太长以至于无法在int
;中表示数字,则总是会出现问题。你得到未定义的行为。我不试图解决这个问题。
这将在每行中提取多个数字,每次调用一个。如果您想要每行一个数字,或者想要控制每行的处理方式,请使用fgets()
或readline()
读取该行,然后sscanf()
进行分析。这样做的一个好处是,如果您愿意,您可以使用诸如strtol()
将数字转换为数字之类的谨慎功能。