在C中将字符数组转换为整数数组以进行ISBN验证

时间:2012-12-06 02:21:35

标签: c arrays string integer isbn

我真的希望有人能给出一个很好解释的例子。我一直在寻找,但找不到合适的解决方案。

我正在介绍C编程课程,我们最后的任务是编写一个用破折号验证10位ISBN的程序...... ISBN作为字符串输入到CHAR数组中。从那里我需要将每个数字分开并将它们转换为整数,这样我就可以计算出ISBN的有效性。最重要的是,需要忽略破折号。

我的思考过程是创建一个INT数组,然后使用循环将每个字符存储到数组中,并通过atoi()函数传递它。我还尝试使用IF语句来检查CHAR数组的每个部分,看它是否找到了破折号。如果找到了,它会跳到数组中的下一个位置。它看起来像这样:

int num[12], i = 0, j = 0, count = 0;
char isbn[12];

    printf ("Enter an ISBN to validate: ");
    scanf ("%13[0-9Xx-]%*c", &isbn);

 do {
        if (isbn[i] == '-') {
            i++;
            j++;
        }
        else {
            num[i]= atoi(isbn[j]);
            i++;
            j++;
        }
        count++;
    } while (count != 10);

但这会造成分段错误,所以我甚至无法判断我的IF语句是否实际过滤了破折号....

如果有人可以尝试解决这个问题,我真的很感激。作业将于12月4日到期,但我延期到12月7日,所以我时间紧迫。

请在解释中写出代码。我是一个视觉学习者,需要一步一步地看。

显然还有很多需要编码的东西,但在我克服这个障碍之前我无法继续前进。

提前致谢!

1 个答案:

答案 0 :(得分:0)

首先,您对isbn的定义不足以容纳13个字符;因此它应该是14个字符长(也存储终止'\0')。

其次,你的循环过于复杂;保持相同值的三个循环变量是多余的。

第三,循环不安全,因为字符串可能与一个字符一样短,但你的代码很快就会循环10次。

最后,转换一个包含数字的ascii值的char可以通过简单地从中减去'0'来转换。

这是经过上述改进后的代码。

#include <stdio.h>

int main(void)
{
    int num[14], i;
    char isbn[14], *p;

    printf("Enter an ISBN to validate: ");
    scanf("%13[0-9Xx-]%*c", &isbn);

    // p iterates over each character of isbn
    // *p evaluates the value of each character
    // the loop stops when the end-of-string is reached, i.e. '\0'
    for (p = isbn, i = 0; *p; ++p) {
        if (*p == '-' || *p == 'X' || *p == 'x') {
            continue;
        }
        // it's definitely a digit now
        num[i++] = *p - '0';
    }

    // post: i holds number of digits in num
    // post: num[x] is the digit value, for 0 <= x < i

    return 0;
}