获取整数的位数

时间:2013-01-05 11:50:33

标签: c

  bool isValidId(int* id)
  {
        if(log10(*id) != 6)
        {
           return false;
        }

   return true;
  }


  printf("Enter ID: ");
  gets(input);
  c.id = atoi(input);
  validID= isValidId(c.id);
  if(!validID)
  {
     printf("Invalid ID format -(Use example 123456 format). \n");
  }

这就是它现在的样子。我要求用户输入一个ID并检查它是否与isValidId方法有效,但是当我输入ID时我的程序崩溃了。请帮忙!感谢

5 个答案:

答案 0 :(得分:9)

return *id >= 100000 && *id < 1000000;

我认为这可能是一个很好的解决方案,既易于阅读又有效率。

如果您只是想判断它是否是有效的身份

,则无需获取其长度

程序崩溃,因为isValidId的参数是指向int的指针,而不是int,所以

validID = isValidId(c.id);

应该是

validID = isValidId(&c.id);

答案 1 :(得分:1)

首先,我认为没有理由将指针传递给isValidId函数。您可以传递一个整数并计算位数。

bool isValidId(int id) {
    // count digits here
}

现在至少有两种计算位数的方法。第一个是使用log10。 10个基数的整数n中的位数是(int)(log10(n) + 1)。您需要导入math.h才能使用log10。您可以在致电n <= 0之前检查log10

第二种方法是循环n

int count = 0;

while (n > 0) {
    count++;
    n /= 10;
}

答案 2 :(得分:1)

  1. 您已声明isValidId指向int,但您传递的是int;在这种情况下,没有理由使用指针,因此最好更改isValidId以使用常规int

  2. 永远不会永远不会使用GETS - 它在您的代码中引入一个失败/主要安全漏洞。请改用fgets(input, sizeof input, stdin)

  3. input如何宣布?它是否足够大以容纳int允许的数字,加上一个符号和一个0终结符?

  4. log10返回double,而不是int。要使用log10正确计算数字,您需要编写类似(int)floor(log10(id)) + 1的内容。

  5. 您可以稍微简化isValidId功能:

    bool isValidId(int id)
    {
      return (int) floor(log10(id)) + 1 == 6;
    }
    

    布尔数据类型是C语言的后来者(在C99中引入),因此我们很多旧类型往往避免在代码中使用布尔常量。

答案 3 :(得分:0)

我没有做过C,但尝试这样的事情

bool isValidId(int* id)
{
    char str[15];
    sprintf(str, "%d", id)
    if(strlen(str) != 6)
    {
        return false;
    }

    return true;
}

答案 4 :(得分:-1)

这样更容易:

#include <math.h>
bool isValidId(int *id)
{
    return (int)log10(*id) == 6;
}