0

我正在尝试将 long long 整数转换为字符串数组,其中 1 的列位于数组的位置 0,10 的列位于位置 1,100 的列位于位置 2,如下所示:

输入: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、100,000、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]);
4

3 回答 3

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));
于 2014-01-19T02:15:07.530 回答
1

在 char 上使用 "%d" 将打印其 ASCII 代码。使用“%c”打印自身。

与您的目的相比,您的字符串顺序是相反的。最右边的数字(1 的列)位于字符串的尾部,最左边的数字位于位置 0。

因此,要打印位置 i 处的数字(从右到左计数),您应该使用:

printf("%c\n", number_str[cclength - i - 1]);
于 2014-01-19T02:23:04.907 回答
1

我将继续扩展我的评论,因为我不相信其他任何一个答案都回答了您的完整问题。

通过将 CC 编号读入 a 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完成此转换后,使用 using%d作为格式说明符在数组中打印出一个值将像您期望的那样工作;即使数组数据类型是char,每个元素也可以打印为十进制整数。

将数字读入 char 数组并进行转换后,您需要做的就是再次遍历数组,执行 CC 验证过程中涉及的任何步骤。如果验证方法要求数字按顺序排列,您可能需要反向遍历数组。

于 2014-01-19T09:43:28.710 回答