[問題] 關於身分證字號判斷

看板C_and_CPP作者 (阿捷)時間15年前 (2010/12/30 01:09), 編輯推噓2(2018)
留言20則, 3人參與, 最新討論串1/1
以下是小弟在網路上看到的函式,想請問各位高手 為什麼return checksum %10 == 0; 可以表示 return 1; 麻煩各位高手解惑,萬分感激! int checkSID(char * str) { char string[]="ABCDEFGHJKLMNPQRSTUVWXYZIO"; //10~35 int i, checksum; if ( strlen(str) == 10 && (str[1] == '1' ||str[1] == '2') ) { i = strchr(string, str[0] & 0xDF) - string + 10; checksum = i / 10 + i % 10 * 9; for(i = 1; i < 9; ++i) checksum += (str[i] - '0') * (9 - i); checksum += (str[9] - '0'); return checksum % 10 == 0; } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.212.80 ※ 編輯: acerder 來自: 122.118.212.80 (12/30 01:09) ※ 編輯: acerder 來自: 122.118.212.80 (12/30 01:12)

12/30 01:15, , 1F
你別把它當"0"或"1" 當成"成立"或"不成立"就好了
12/30 01:15, 1F

12/30 01:16, , 2F
if(checkSID(idstring)) //idstring是合法的身份證字號
12/30 01:16, 2F

12/30 01:16, , 3F
通常是這樣用的
12/30 01:16, 3F

12/30 01:17, , 4F
要說為什麼是"0"或"1"兩個數字你會亂掉 所以你這樣看就好
12/30 01:17, 4F

12/30 01:18, , 5F
對了 最後那個 return 0; 請看成 return 不成立;
12/30 01:18, 5F

12/30 01:18, , 6F
(這時就覺得 true 和 false 兩個關鍵字是好物...)
12/30 01:18, 6F

12/30 01:19, , 7F
有 _Bool、true、false 可用, 沒有就自定巨集, 不知道
12/30 01:19, 7F

12/30 01:19, , 8F
嵌一堆魔法數字是要看什麼...
12/30 01:19, 8F

12/30 01:44, , 9F
感謝樓上兩位,但其實我想問的是為什麼程式不需要再對算出
12/30 01:44, 9F

12/30 01:45, , 10F
的檢查碼與最後一碼做比對,而是直接checksum % 10 == 0
12/30 01:45, 10F

12/30 01:47, , 11F
判斷是否成立,不太了解是怎麼判斷是否成立的
12/30 01:47, 11F

12/30 02:25, , 12F
checksum % 10 == 0, 當 checksum 整除 10 時, 結果為
12/30 02:25, 12F

12/30 02:26, , 13F
真, 回傳值轉成整數 1, 整除結果為假, 回傳值轉整數 0
12/30 02:26, 13F

12/30 02:27, , 14F
也就等於以下程式 if( checksum % 10 == 0 ) return
12/30 02:27, 14F

12/30 02:27, , 15F
(int)true; else return (int)false; 只是這樣寫是多
12/30 02:27, 15F

12/30 02:28, , 16F
此一舉, 已經有想要的回傳值, 拿來用就好
12/30 02:28, 16F

12/30 02:35, , 17F
至於如何去驗證, 整除10 & 減去個位數概念是一樣的
12/30 02:35, 17F

12/30 10:51, , 18F
不好意思我耍笨了,沒仔細看程式碼已經把最後一碼加入
12/30 10:51, 18F

12/30 10:52, , 19F
checksum 如此只要是正確的當然%10 == 0 一開始是沒注意到
12/30 10:52, 19F

12/30 10:53, , 20F
checksum += (str[9] - '0')這行 >"< 感謝樓上各位
12/30 10:53, 20F
文章代碼(AID): #1D6sjDpw (C_and_CPP)