2014-02-10 67 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 :) –