如何检测整数的长度?如果我有le:int test(234567545);
我怎么知道int有多长?比如告诉我里面有9个数字???
我尝试过:
char buffer_length[100];
// assign directly to a string.
sprintf(buffer_length, "%d\n", 234567545);
string sf = buffer_length;
cout <<sf.length()-1 << endl;
但是大部分都是更简单的方式或者更干净......
答案 0 :(得分:35)
分裂怎么样:
int length = 1;
int x = 234567545;
while ( x /= 10 )
length++;
或使用<math.h>
中的log10
方法。
注意 log10
会返回double
,因此您必须调整结果。
答案 1 :(得分:11)
创建一个功能:
int count_numbers ( int num) {
int count =0;
while (num !=0) {
count++;
num/=10;
}
return count;
}
答案 2 :(得分:6)
似乎没有人提到将它转换为字符串,然后获得长度。我不确定这是多么高效,但它确实在一行代码中完成:)
int num = 123456;
int len = to_string(num).length();
cout << "LENGTH of " << num << " is " << len << endl;
// prints "LENGTH of 123456 is 6"
答案 3 :(得分:4)
如果“i”是整数,那么
int len ;
char buf[33] ;
itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ?
len = strlen(buf) ;
if(i < 0)
len-- ; // maybe if you don't want to include "-" in length ?
答案 4 :(得分:4)
您可以使用stringstream
进行此操作,如下所示
stringstream ss;
int i = 234567545;
ss << i;
cout << ss.str().size() << endl;
答案 5 :(得分:4)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i=2384995;
char buf[100];
itoa(i, buf, 10); // 10 is the base decimal
printf("Lenght: %d\n", strlen(buf));
return 0;
}
请注意itoa不是标准函数,即使它受到许多编译器的支持。
答案 6 :(得分:0)
unsigned udc(unsigned u) //unsigned digit count
{
unsigned c = 0;
do
++c;
while ((u /= 10) != 0);
return c;
}
测试 u 是否小于 10 可能更便宜,以避免在 u的情况下出现不必要的除法,增量和cmp指令&lt;的 10 强>
但在这个主题上,优化时,你可以简单地测试你对抗十的恒定功率。
unsigned udc(unsigned u) //unsigned digit count
{
if (u < 10) return 1;
if (u < 100) return 2;
if (u < 1000) return 3;
//...
return 0; //number was not supported
}
可以为每个数字节省 3 指令,但不太适合不同的基数,除了不那么有吸引力,而且手工编写也很乏味,在这种情况下你宁愿写一个在将例程插入程序之前编写例程的例行程序。因为C只支持非常有限的数字, 64位, 32位, 16位, 8位,您可以简单地限制自己生成常规以使所有尺寸受益的最大值。
如果你&lt;为负数而烦恼,你只需否定 你在计算位数之前 0 。当然首先要提供常规支持签名号码。
如果你知道你&lt; <强> 1000 下, 它可能更容易编写,而不是编写例程。
if (u > 99) len = 3;
else
if (u > 9) len = 2;
else len = 1;
答案 7 :(得分:-1)
len = 1 + floor(log10(n)); // c ++ code lib(cmath)