获取整数位数

Getting number of int digits

我正在使用 fscanf(fp, "%d", &n) 函数从文件中读取一个整数。

有没有办法知道这个数字有多少位没有循环?

是的,将其作为字符串读取:

char buffer[256];
fscanf(fp, "%s", buffer);
int length = strlen(buffer);

注意:如果它是负数,您可能需要打折 - 符号...

假设您仍然想要整数值:

int n = atoi(buffer);
int optionalwhitespace, characters;
if (fscanf(fp, " %n%d%n", &optionalwhitespace, &n, &characters) != 1) /* error */;
characters -= optionalwhitespace;
// characters now has the number of characters read to interpret the value in n
#include<math.h>

//rest of program
fscanf(fp, "%d", &n)
int length = (int)(log10(n)) +1;
//rest of program

你可以试试:

int count = 0;
fscanf(fp, "%d%n", &n, &count);

%n 说明符输入 count 到目前为止读取的字符数。

但是,此数字可以大于 n 的位数,因为 %d 说明符允许在读取数字之前跳过空白字符。

检查@pmg 的 以了解如何计算这些空格。

通过使用log函数:

int number_of_digits(unsigned int i)
{
    return (int)(log(i+1) / log(10)) + 1;
}

int main (void)
{
    int i = 52;
    printf("%d has %d digits\n", number_of_digits(i));
}

您可以使用 snprinf,这是比 itoa 更好的选择:

int x = 0;
scanf( "%d", &x );
char buffer[20] = "";
snprintf(buffer, sizeof(buffer), "%d", x);
printf( "num of digits = %d", strlen(buffer) );

试试这个:

#include <math.h>
number > 0 ? (int) log10 ((double) number) + 1 : 1;

您可以只数 log10 个数字,然后像这样四舍五入:

int length = ceil(log10((double)n)) + 0.5;

+ 0.5 用于将浮点数转换为整数,因为像 3 这样的数字不能明确地写在浮点表示中 (int)3.0 可能会产生 2。我假设 ceil return 不会被 0.5 回答,这永远不会发生。

Is there a way to know how many digits that number has without loops?

递归解决方案

unsigned digit_count(unsigned x) {
  if (x >= 10) return digit_count(x /10) + 1;
  return 1;
}

对于代码高尔夫方法,只需 return snprintf()

的值
width = snprintf(0, 0, "%u", (unsigned) n);