チェックデジットのモジュラス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をかけるかどうかを判断とかにすればいいのかもね。
まあ、長々しくなったけど、チェックかける必要がなければ、そのままでよいというオチ。
ご利用、ご自由にどうぞ。