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时我的程序崩溃了。请帮忙!感谢
答案 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)
您已声明isValidId
指向int
,但您传递的是int
;在这种情况下,没有理由使用指针,因此最好更改isValidId
以使用常规int
。
永远不会永远不会使用GETS - 它将在您的代码中引入一个失败/主要安全漏洞。请改用fgets(input, sizeof input, stdin)
。
input
如何宣布?它是否足够大以容纳int
允许的数字,加上一个符号和一个0终结符?
log10
返回double
,而不是int
。要使用log10
正确计算数字,您需要编写类似(int)floor(log10(id)) + 1
的内容。
您可以稍微简化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;
}