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

标签 c arrays string integer isbn

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

我正在学习 C 编程入门类(class),我们的最后一个作业是编写一个程序,该程序用破折号验证 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 日,所以我时间紧迫。

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

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

提前致谢!

最佳答案

首先,您对 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;
}

关于在 C 中将字符数组转换为整数数组以进行 ISBN 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735957/

相关文章:

ios - segue 没有在 segue 中传输字符串(swift4)

从 NodeJs 调用 C 库

c - GTK3.0项目移植到GTK2.0

c - c中的字符串数组声明

javascript - 我怎样才能在 redux 中正确克隆 json 数组?

c# - 每个 ComboBox.Selected... 返回什么?

c - QEMU 的 UART 驱动程序接收 `delete` 字节而不是 `backspace`

C Unix - 循环中的 fork()、execl() 和管道

c++ - c/c++ 中数组元素的别名

string - panic : runtime error: slice bounds out of range [2:1]