2
  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 时我的程序崩溃了。请帮忙!谢谢

4

5 回答 5

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

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

如果只是想判断它是否是有效的id,则无需获取它的长度

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

validID = isValidId(c.id);

应该

validID = isValidId(&c.id);
于 2013-01-05T12:03:59.460 回答
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;
}
于 2013-01-05T12:04:31.817 回答
1
  1. 你已经声明isValidId了一个指向 an 的指针int,但是你传递给它一个 plain int; 在这种情况下,没有理由使用指针,所以最好isValidId改为使用常规int.

  2. 永远永远永远永远永远不要使用 Gets - 它在您的代码中引入一个故障点/重大安全漏洞。改为使用fgets(input, sizeof input, stdin)

  3. 如何input声明?它是否足够大,可以容纳尽可能多的数字int,加上一个符号,再加上一个 0 终止符?

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

您可以isValidId稍微简化您的功能:

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

Boolean 数据类型是 C 语言的后来者(在 C99 中引入),所以我们很多旧类型倾向于避免在我们的代码中使用 Boolean 常量。

于 2013-01-05T14:10:22.673 回答
0

我已经很久没有做过 C 但是尝试这样的事情

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

    return true;
}
于 2013-01-05T12:01:21.913 回答
-1

像这样更容易:

#include <math.h>
bool isValidId(int *id)
{
    return (int)log10(*id) == 6;
}
于 2013-01-05T11:57:33.343 回答