我真的希望有人能给出一个很好解释的例子。我一直在寻找,但找不到合适的解决方案。
我正在介绍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日,所以我时间紧迫。
请在解释中写出代码。我是一个视觉学习者,需要一步一步地看。
显然还有很多需要编码的东西,但在我克服这个障碍之前我无法继续前进。
提前致谢!
答案 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;
}