当我将数字放在字符串的第一位时,使用 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 的原因。
所以,我在某处看到这段代码,它从给定的字符串中提取数字。
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 的原因。