チェックデジットのモジュラス10/ウェイト3を算出

#include	<stdio.h>
#include	<string.h>

int		chkdegit(
		// チェックデジット
		// モジュラス10/ウェイト3を算出
char *		str,
int		size
)

{
	int	i, chk;
	for (i = 0, chk = 0; i < size; i++) {
		chk += (str[size - 1 - i] - '0') * (!(i % 2) ? 3 : 1);
	}
	chk %= 10;
	return (10 - chk) % 10;
}


int		main(
int		argc,
char *		argv[]
)

{
	int	chk;
	
	if (argc > 1) {
		chk = chkdegit(argv[1], strlen(argv[1]));
		printf("%s-%d", argv[1], chk);
	}
	else puts("引数にバーコード配列を渡してね");
	
	return 0;
}

奇数行の場合は、前にゼロがついたのと同じようにみなす(奇数行がそもそもあり得ないはずだけど)。


めんどくさいから、'0'から'9'まで以外が入ってなかった場合のチェックカケテナス。
if (str[size - 1 - i] >= '0' && str[size - 1 - i] <= '9') { ... } else return -1;
とかでいいのかもね、でも、マイナスが返るってどうなんだろ、うーん。
カッコがあったりした場合に、スキップする仕様にすればいいのかな。
その場合、iの代わりに、カウント変数をもって、'0'から'9'までならカウント進めて、それ以外は、カウント進めずにコンテニュー。
で、カウントが奇数か偶数かでウェイト3をかけるかどうかを判断とかにすればいいのかもね。
まあ、長々しくなったけど、チェックかける必要がなければ、そのままでよいというオチ。


ご利用、ご自由にどうぞ。