当我将数字放在字符串的第一位时,使用 sscanf 作为数字提取器无法正常工作

using sscanf as number extractor didn't work properly when I put number first in a string

所以,我在某处看到这段代码,它从给定的字符串中提取数字。

while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n))
    {
        total_n += n;
        answer +=i;
        printf("%d\n",i);
    }

所以当我输入“Monkey78hi9123”时,它给出

78
9123

这正是我所期望的,而且效果非常好。 但是,当我把数字放在第一位而不是字母表时

例如, “143Monkey3000” 它什么都不打印。

我对这个输入的期望是

143
3000

但我一无所获

我不知道是什么导致了这个问题。有人可以帮忙吗?

格式说明符 %*[^0123456789] 将匹配(并丢弃)一个或多个 non-digit 字符。所以如果输入字符串以数字开头,会匹配失败,scanf会立即return 0.

遗憾的是,scanf 中没有匹配零个或多个字符的好方法,因此您最终需要多次调用 sscanf:

while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n) ||
       1 == sscanf(s + total_n, "%d%n", &i, &n)) {

这适用于 sscanf,因为您可以轻松地重新扫描相同的字符串,但使用 fscanf 可能效果不佳。这就是为什么您经常需要 fgets+sscanf 而不是 fscanf 的原因。