2014-02-10 20 views
0

我是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 
} 

可能有人指出我做错了什么,我尝试了不同的方法,似乎没有任何工作。

+0

当您的意思是“0”时,切勿写入“48”。 – unwind

回答

1

您回路从010

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

你永远写intVerif[11]使其包含垃圾。

intCnp[]也有类似的问题。

编辑:(在OP的评论)

看起来你输入:"1650116398203"13字母长,而你的cnp阵列需要一个额外的空间\0字符。因此,您的输入导致数组超出界限,导致未定义的行为。

+0

我已经解决了这个问题,并且将它设置为'<='而不是'<,但输出仍然是'(lldb)',即使两个int数组现在都获得了正确的元素。 –

+0

@ cristian.malita:你可以用'<='来修正循环,但请不要这样做。一个'N'元素数组的'for'循环看起来像这样:'for(i = 0; i 提供空间。你也应该限制字符的长度在奥得读,避免缓冲区溢出:

scanf("%13s", cnp); 

这里,十三意味着最多13个字符(加上终止空字符)被读取。

这是一个好主意,检查您的字符串实际上是否有13位数字,以便您不处理垃圾字符。并且您忘记了满足余数为10的情况 - 在这种情况下,校验位是1.

+0

哦!我没有看到你的答案!更新我的答案也有同样的多余原因。感谢您指出一个更好的解释。 +1 :) –