这个小程序,错在哪里?该如何解决

这个小程序,错在哪里?
我是新手,刚开始学C,主要是想用C做一些竞赛题。

题目是:输入一个不超过10的9次方的正整数,输出它的位数。例如12735的位数是5.请不要使用任何数学函数,只用四则运算和循环语句实现。

下面是我的代码:
C/C++ code
#include <stdio.h>

int main(){
    
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    unsigned long n = 0;
    int count = 1;
    scanf("%d",&n);
    while((n /= 10) >= 1){
             count++;               
    }
    printf("%d",count);
    return 0;
}


我建立了一个in.txt,当里面的内容是1234567时,out.txt输出7,很正确,但是我写成12345678910,它就输出10,少了一位!我写成1234567891011,它还是输出10!

请问这是怎么回事?
谢谢!

------解决方案--------------------
12345678910 是否超过了long的上限?
------解决方案--------------------
long int 最大范围为:2147483647,即使unsigned long的范围也仅到:4294967295
------解决方案--------------------
unsigned long 上限2的32次方减1,相当于4294967295,只有10位,
你这样做当然只会输出10啦
------解决方案--------------------
用long long 可以保存64位二进制的数字
------解决方案--------------------
整形数中long int和int是一样的,对于32位的计算机,都是一个计算机位,即32位,最大的也就2的31次方减1,就算unsigned也才2的32次方减1,十进制最大4乘以10的9次方罢了,所以不能有11位,最大10.