我正在尝试将长整数转换为字符串数组,其中1列位于数组的第0位,10位列位于第1位,100位列位于第2位,如下所示:
INPUT:4444555566667777 ----->产出:[4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7]
为了测试我的代码,我写了最后一行printf("%d\n",number_str[3])
。我希望我的程序输出位置4的值,“7”。相反,它输出“52”。正如我预期的那样,将我的最后一行更改为printf("%d\n",number_str[4])
会产生“53”而不是“6”。谁能解释一下发生了什么?
当然52和53对应于ASCII值,但是,如何将它们转换为整数?我可以这样做吗?
我在这个程序的这一部分的目标是将10,1,000,1000,10,000,000 ......列中的所有数字相加。基数为10的信用卡号码中的每隔一位数字。这是我尝试Luhn验证的一步。
// Libraries
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Program
int main(void)
{
// Get CC number
printf("Enter your credit card number: ");
long long number_ll = GetLongLong();
// printf("%lld\n", number_ll);
// Convert long long to string
char number_str[64];
sprintf(number_str, "%lld", number_ll);
// printf("%s\n", number_str);
// Get length of card number string
int cclength = strlen(number_str);
// Check the length of card number string
if ( ! (cclength == 13 || cclength == 15 || cclength == 16))
printf("INVALID\n");
else
printf("%d\n",number_str[3]);
答案 0 :(得分:3)
将ascii转换为整数使用
#include <stdlib.h>
int atoi(const char *str);
更改此
printf("%d\n",number_str[3]);
到
char buf[2];
buf[0]=number_str[3];
buf[1]='\0';
printf("%d\n",atoi((const char*)buf));
答案 1 :(得分:1)
使用&#34;%d&#34;在char上将打印其ASCII码。使用&#34;%c&#34;打印自己。
与你的目的相比,你的字符串的顺序是颠倒的。最右边的数字(1&#39; s列)位于字符串的尾部,最左边的数字位于0的位置。
所以要打印位置i的数字(从右到左计数),你应该使用:
printf("%c\n", number_str[cclength - i - 1]);
答案 2 :(得分:1)
我会继续扩展我的评论,因为我不相信其他任何一个答案都回答了你的完整问题。
通过将CC编号读入long long
,然后使用sprintf
将数字插入字符数组,我会说您正确地将数字输入到可以使用的表单中用于验证。实际上,您可以检查sprintf
的返回值,看看它是否是有效数字(尽管由于您插入了long long
,故障情况不太可能。
在字符数组中有CC编号后,您就会知道数组的每个元素都包含一个字符,对应于CC编号中的一个数字。听起来就像你的目的一样,数组中的值更有用的是十进制值,而不是ASCII值。从逻辑上讲,这是值'0'
和0
之间的差异。您可以查找任何ASCII图表以查看每个字符的相应ASCII值,但由于字符可以像整数一样进行操作,因此您可以遍历该数组:
for(i = 0; i < 64; i++) num_str[i] -= '0';
请注意,这不会处理CC号字符后数组中少于64个字符或未初始化的值,因此您需要对其进行修改。重要的是要知道你只是将字符值向下移动'0'
,恰好有整数值48。
完成此转换后,使用printf
使用%d
打印数组中的值作为格式说明符将按预期工作;即使数组数据类型为char
,每个元素也可以打印为十进制整数。
一旦你将数字读入char数组并进行转换,你需要做的就是再次遍历数组,执行CC Validation过程中涉及的任何步骤。如果验证方法要求数字按顺序排列,则可能需要反向遍历数组。