我真的希望有人能给出一个很好解释的例子。我到处寻找但找不到合适的解决方案。
我正在学习 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/