0

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

我正在介绍 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 日,所以我时间紧迫。

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

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

提前致谢!

4

1 回答 1

0

首先,您的定义isbn不足以容纳 13 个字符;因此它应该是 14 个字符长(也存储 terminating '\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;
}
于 2012-12-06T03:23:51.313 回答