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

在C中将字符数组转换为整数数组以进行ISBN验证,c,arrays,string,integer,isbn,C,Arrays,String,Integer,Isbn,我真的希望有人能给出一个很好的例子。我到处找,但找不到合适的解决办法 我正在学习C编程课程的介绍,我们的最后一个作业是编写一个程序,用破折号验证一个10位数的ISBN。。。ISBN作为字符数组中的字符串输入。从那里我需要分离每个数字并将它们转换成一个整数,这样我就可以计算ISBN的有效性。除此之外,需要忽略破折号 我的想法是创建一个INT数组,然后使用循环将每个字符存储到数组中,并将其传递给atoi()函数。我还尝试使用IF语句检查CHAR数组的每个部分,看它是否找到了破折号。如果它确实找到了一

我真的希望有人能给出一个很好的例子。我到处找,但找不到合适的解决办法

我正在学习C编程课程的介绍,我们的最后一个作业是编写一个程序,用破折号验证一个10位数的ISBN。。。ISBN作为字符数组中的字符串输入。从那里我需要分离每个数字并将它们转换成一个整数,这样我就可以计算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值的字符可以通过简单地从中减去
'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;
}
#包括
内部主(空)
{
int num[14],i;
char-isbn[14],*p;
printf(“输入要验证的ISBN:”;
scanf(“%13[0-9Xx-]%*c”,&isbn);
//p迭代isbn的每个字符
//*p计算每个字符的值
//当到达字符串末尾时,循环停止,即“\0”
对于(p=isbn,i=0;*p;++p){
如果(*p='-'| |*p=='X'| |*p=='X'){
继续;
}
//现在肯定是个数字了
num[i++]=*p-'0';
}
//post:我保存num中的位数

//post:num[x]是0的数字值,所以您只需要将字符串的每个数字转换为一个整数数组?您是否使用了
gdb
来找出它崩溃的地方?以及应该如何处理
'x'
'x'
?由于您是编程新手,另一个建议是进行所谓的“穴居人调试”。要做到这一点,请在代码中插入
printf
,以确定崩溃发生的位置。这并不苛刻,但编程的基本技能之一是学习如何找到自己的错误。当我使用
atoi
函数时,它会崩溃。它还需要忽略破折号,我希望我的IF语句能够实现。我确实使用了<代码>要调试的printf
,但我没有包括它们…如果是ISBN的一部分,那么X代表10。我给你一个提示,
atoi()
需要一个字符串参数,但您传递的是一个字符。对于这个赋值,ISBN应该只有10个数字,但我忘记了终止字符……我尝试编译您的代码,但在使用
printf
时,它仍然无法正确显示
num[]的值
在循环中,这是我运行它时的结果:
输入一个ISBN进行验证:0-07-881809-5 9160641715232767000000
@user1880970您是否在分配该语句后放置了该语句?因为到那时
I
已经递增,因此您将得到意外的结果。@mdzura117这是错误的,因为
I
到那时会有错误的值。好的,我知道了。非常感谢你的帮助:D