使用字符串数组调用1,10,100的整数列

时间:2014-01-19 02:08:09

标签: c credit-card cs50 luhn

我正在尝试将长整数转换为字符串数组,其中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]);

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过程中涉及的任何步骤。如果验证方法要求数字按顺序排列,则可能需要反向遍历数组。