C 数字代码验证器

标签 c

我是 C 语言和一般编程的新手,所以我学习了一些,想制作一个简单的程序来验证我所在国家/地区的个人数字代码。这是程序:

#include <stdio.h>

int validateCNP(char cnp[13]);

int main(int argc, const char * argv[])
{
    char cnp[13];
    printf("Introduceti CNP-ul:\n");
    scanf("%s", cnp);
        if(validateCNP(&cnp[0]) == 1) {
    printf("CNP valid");
        } else {
            printf("CNP invalid");
        }


    return 0;
}

int validateCNP(char cnp[13]) {

    char verif[13];
    int intVerif[12], intCnp[13];
    int i, checksum = 0;
    strcpy(&verif[0], "279146358279");

    for (i = 0; i<11; i++){
        intVerif[i] = (unsigned)verif[i] - 48;
    }

    for (i=0; i<12; i++) {
        intCnp[i] = cnp[i] - 48;
    }

    for (i=0; i<11; i++) {
        checksum += intCnp[i] * intVerif[i];
    }

    checksum %= 11;

    if (checksum == intCnp[12]) {
        return 1;
    } else {

    return 0;
    }
}

示例输出

Introduceti CNP-ul:
1650116398203
(lldb) 

似乎在将字符串转换为 int 数组时,它搞砸了最后一个元素

Printing description of intVerif:
(int [12]) intVerif = {
  [0] = 2
  [1] = 7
  [2] = 9
  [3] = 1
  [4] = 4
  [5] = 6
  [6] = 3
  [7] = 5
  [8] = 8
  [9] = 2
  [10] = 7
  [11] = 32767
}
Printing description of intCnp:
(int [13]) intCnp = {
  [0] = 1
  [1] = 6
  [2] = 5
  [3] = 0
  [4] = 1
  [5] = 1
  [6] = 6
  [7] = 3
  [8] = 9
  [9] = 8
  [10] = 2
  [11] = 0
  [12] = 0
}

谁能指出我做错了什么,我尝试了不同的方法,但似乎都没有用。

最佳答案

MadHatter 已经指出了您的基本错误:您的循环省略了最后一个条目。

main 中的另一个错误:CNP 的长度为 13 个字符,因此您的 cnp 数组必须至少有 14 个字符 - 您必须为终止空字符 '\0 '。您还应该限制要读取的字符的长度,以避免缓冲区溢出:

scanf("%13s", cnp);

这里的13表示最多读取13个字符(加上终止空字符)。

检查您的字符串是否真的有 13 位数字是个好主意,这样您就不会处理垃圾字符。而且您忘记了满足余数为 10 的情况 - 在这种情况下,校验位为 1。

关于C 数字代码验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21674846/

相关文章:

c - 简单链表指针(和错误)问题

c - Visual Studio 2010 win 32位项目导入DLL

c - 试图解决 C 中未知的段错误

c - 如何按包含日期的字符串对数据结构进行排序?

c - FLAG=-DNDEBUG 没有在 C 中禁用 assert()

c - 如何让打印机在 MS VC++ Express 版本中使用 C 语言工作?

使用多个线程计算给定间隔的总和

c++ - 如何将elasticsearch的数据保存为json格式?

c - Solaris 中 prstat SIZE 值增加是否表示内存泄漏?

c - 获取未初始化指针的地址是未定义的行为吗?