[問題] 新手 請幫忙除錯!(不知哪裡有錯)

看板C_and_CPP作者 (zzoo)時間9年前 (2016/07/02 20:50), 9年前編輯推噓9(9016)
留言25則, 10人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)VC++2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)NO 問題(Question):我是要設計一個可以打密碼的程式 預設密碼是ABCDe111111 但是我一執行 按完密碼後就完全卡在那邊 也沒有當機的現象 我真的不知道怎麼了 *[m 餵入的資料(Input):ABCDe111111 預期的正確結果(Expected Output):電腦顯示:correct!,程式正常結束 錯誤結果(Wrong Output):如上文講到的,黑黑畫面上的那個底線就一直閃一直閃 完全沒有繼續執行,感覺像是還在getche那段 程式碼(Code):(請善用置底文網頁, 記得排版) #include<stdio.h> #include<stdlib.h> #include<conio.h> int main() { char passcode[40]; int a; printf("請輸入密碼:\n"); for (a = 0; passcode[a] != 13; a++) { passcode[a] = _getche();/*getche前面有底線是他教我用的/* if (passcode[a] == 8) { a -= 1; } } char correct[] = { 'A','B','C','D','e','1','1','1','1','1','1',13 }; a = 0; check: if (correct[a] == passcode[a]) { if (passcode[a] == 13) { goto correct; } else { a++; goto check; } } else if (correct[a] != passcode[a]) goto wrong; correct: printf("correct!\n"); goto end; wrong: printf("WRONG!\n"); end: system("PAUSE"); return 0; } 補充說明(Supplement):我之所以不用getch是因為我想清出的知道發生甚麼事 等問題解決了會改回getch*[m -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.162.68.162 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1467463844.A.388.html ※ 編輯: belaniconaze (1.162.68.162), 07/02/2016 20:51:54 ※ 編輯: belaniconaze (1.162.68.162), 07/02/2016 20:52:28

07/02 20:57, , 1F
這是多久以前的例子?getch() 與 getche() 好像是 dos
07/02 20:57, 1F

07/02 20:58, , 2F
年代使用的方式。還用 goto,雖然 goto 是合法的關鍵字
07/02 20:58, 2F

07/02 20:58, , 3F
可是儘可能不要使用。
07/02 20:58, 3F

07/02 21:01, , 4F
是 for 條件句的問題嗎
07/02 21:01, 4F

07/02 21:02, , 5F
改成 a < 11 呢
07/02 21:02, 5F

07/02 21:04, , 6F
如果記得沒錯的話 passcode[a] != 13 這樣子的意思是
07/02 21:04, 6F
poolongkong: passcode[a] 裡面的值不等於13 對壓,13對應到的是enter鍵,我的意思是如果按了enter就跳離for迴圈 ※ 編輯: belaniconaze (1.162.68.162), 07/02/2016 21:43:26 喔還有,我每次建置的時候他都說組態已過期 ※ 編輯: belaniconaze (1.162.68.162), 07/02/2016 21:48:33

07/02 21:50, , 7F
for迴圈的部分,你讀完放到passcode[a],for在判斷
07/02 21:50, 7F

07/02 21:50, , 8F
前a會先++,判的不是你剛存的那一個(會是a-1)
07/02 21:50, 8F
謝謝樓上!

07/02 21:51, , 9F
補充一下怕誤會,for判斷p...[a],換行在p...[a-1]
07/02 21:51, 9F

07/02 22:28, , 10F
char(13)+char(10) 在vc底下似乎才是按enter會送出的內容
07/02 22:28, 10F

07/02 22:28, , 11F
所以用來判斷停止的條件永遠達不到,就卡在迴圈裡面了
07/02 22:28, 11F

07/02 22:35, , 12F
check裡面用來比較的程式碼也很怪,你要一個字元一個字元比
07/02 22:35, 12F

07/02 22:36, , 13F
結果輸入密碼的地方有用for迴圈,check那邊卻沒有,超怪..
07/02 22:36, 13F

07/02 22:38, , 14F
喔,看懂了,沒用過這種goto的迴圈用法...
07/02 22:38, 14F

07/03 02:18, , 15F
passcode沒初始化也不知道一開始passcode[0]是甚麼值
07/03 02:18, 15F

07/03 02:18, , 16F
或許一開始passcode[0]剛好值就是13那不就沒輸入密碼
07/03 02:18, 16F

07/03 10:15, , 17F
居然是dos時代的標頭檔XD
07/03 10:15, 17F

07/03 10:46, , 18F
要用換行字元當結束條件,用'\n'比較好
07/03 10:46, 18F
※ 編輯: belaniconaze (1.162.85.191), 07/03/2016 13:07:13 我已經改成這樣了,但還是不知哪裡出錯,一直不行 #include<stdio.h> #include<stdlib.h> #include<conio.h> int main() { char passcode[40]; int a=0; printf("請輸入密碼:\n"); while(passcode[a-1]!='\n') { passcode[a] = _getche(); if (passcode[a] == 8) { a -= 1; } a++; } char correct[] = { 'A','B','C','D','e','1','1','1','1','1','1','\n' }; a = 0; check: if (correct[a] == passcode[a]) { if (passcode[a] == 13) { goto correct; } else { a++; goto check; } } else if (correct[a] != passcode[a]) goto wrong; correct: printf("correct!\n"); goto end; wrong: printf("WRONG!\n"); end: system("PAUSE"); return 0; } 其實就是一些微調而已,我還是不知怎麼了一直無法跳離迴圈 ※ 編輯: belaniconaze (1.162.85.191), 07/03/2016 13:15:55

07/03 14:09, , 19F
既然都用VC2015了, 直接用除錯功能單步執行看看如何?
07/03 14:09, 19F

07/03 14:26, , 20F
while 會用到 passcode[-1]
07/03 14:26, 20F

07/03 16:36, , 21F
先從正確密碼只有兩個字元開始
07/03 16:36, 21F

07/03 16:43, , 22F
如果只是要把換行字元當成跳出迴圈的條件,其實不必讓正確密
07/03 16:43, 22F

07/03 16:44, , 23F
碼內有換行字元
07/03 16:44, 23F

07/04 16:09, , 24F
程式有改組態當然過期。微軟的那美克星中文隨便看就好
07/04 16:09, 24F

07/07 12:18, , 25F
springman老師好!
07/07 12:18, 25F
文章代碼(AID): #1NTxYaE8 (C_and_CPP)