c - C语言中的Luhn算法;使用atoi函数调试问题
问题描述
我在获取用户输入的字符串中的单个字符并将它们转换为整数时遇到问题。我使用XCode,使用atoi函数时弹出的错误是:
将“char”传递给“const char *”类型参数的指针对话不兼容的整数
然后我用 获取地址&
,然后它要求我通过添加来解决问题&
。然而,每当我这样做时,调试屏幕就会出现,我不知道从那里做什么。有人可以告诉我如何正确格式化吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char cardnumber[17];
printf("Enter your card number: ");
scanf("\n%s",cardnumber);
int c;
for (c=0; cardnumber[c]!='\0'; c++)
{
if (isdigit(cardnumber[c]) == 0)
{
printf("Invalid Entry");
}
}
int i=0;
int odd1 = atoi(cardnumber[i]);
int odd2 = atoi(cardnumber[i+2]);
int odd3 = atoi(cardnumber[i+4]);
int odd4 = atoi(cardnumber[i+6]);
int odd5 = atoi(cardnumber[i+8]);
int odd6 = atoi(cardnumber[i+10]);
int odd7 = atoi(cardnumber[i+12]);
int odd8 = atoi(cardnumber[i+14]);
int s1 = odd1*2;
int s2 = odd2*2;
int s3 = odd3*2;
int s4 = odd4*2;
int s5 = odd5*2;
int s6 = odd6*2;
int s7 = odd7*2;
int s8 = odd8*2;
int t1 = ((s1/10)+(s1%10));
int t2 = ((s2/10)+(s2%10));
int t3 = ((s3/10)+(s3%10));
int t4 = ((s4/10)+(s4%10));
int t5 = ((s5/10)+(s5%10));
int t6 = ((s6/10)+(s6%10));
int t7 = ((s7/10)+(s7%10));
int t8 = ((s8/10)+(s8%10));
int even1 = atoi(cardnumber[i+1]);
int even2 = atoi(cardnumber[i+3]);
int even3 = atoi(cardnumber[i+5]);
int even4 = atoi(cardnumber[i+7]);
int even5 = atoi(cardnumber[i+9]);
int even6 = atoi(cardnumber[i+11]);
int even7 = atoi(cardnumber[i+13]);
int checkdigit = atoi(cardnumber[i+15]);
int check=((t1+t2+t3+t4+t5+t6+t7+t8+even1+even2+even3+even4+even5+even6+even7)%10);
if(check==0)
{
if(check==checkdigit)
{
printf("Your card is accepted.");
}
else
{
printf("Invalid entry.\n");
}
}
else
{
if(10-check==checkdigit)
{
printf("Your card is accepted.");
}
else
{
printf("Invalid entry.\n");
}
}
return 0;
}
解决方案
假设您的输入是 ASCII,所有数字字符都有连续的整数代码。因此,一旦您测试isdigit()
所有字符实际上都是数字,就足以'0'
从每个数字中减去字符零的代码以获得它们的数值:
int odd1 = cardnumber[i] - '0';
int odd2 = cardnumber[i+2] - '0';
...等等。
推荐阅读
- kubernetes - 使用补丁更改 Kubernetes 部署请求
- java - 如何在 MYSQL 中按年计算订单组的统计信息?
- browser - 在用户关闭 Selenium 浏览器之前调用函数
- python - 将新列添加到数据框,但熊猫的顺序发生了变化
- c++ - 如何调试触发gdb内部错误的C++程序?
- windows - cmd脚本中的net use永远挂起-如果服务器拒绝连接,如何设置超时
- elasticsearch - 使用 NEST 中的映射进行批量更新
- java - 一个非常大的无向图计算所有顶点的最短路径。如何提高效率?可以拆分和合并吗?
- matomo - matomo 内容跟踪未通过仪表板
- python - 使用自动编码器降维后对数据进行聚类