2016-09-16 126 views
-2

我正在嘗試編寫一個代碼來檢查大寫字母的密碼。 當我使用大寫字母輸入密碼時,程序按預期運行(輸出'1'和輸入的密碼)。 但是,如果我輸入不帶大寫字母的密碼,程序將崩潰。程序崩潰

我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() { 

    char password[100]; 
    int i = 0; 
    int upper = 0; 

    printf("Enter a password with an uppercase letter: "); 
    scanf("%s", password); 

    for (i = 0; i <= 100; i++) { 
     if (isupper(password[i])) { 
      upper = 1; 
      break; 
     } 
    } 

    printf("%d\n", upper); 
    printf("%s\n", password); 

    system("pause"); 
    return (0); 
} 

的錯誤:

調試斷言失敗!

計劃: ... 15 \項目\ ConsoleApplication3 \調試\ ConsoleApplication3.exe文件: minkernel \ CRT顯示器\ ucrt的\ src \ appcrt \轉換\ isctype.cpp行:36

表達:C> = -1 & &ç< = 255

有關您的程序如何可以導致斷言失敗的信息, 看到斷言在Visual C++文檔。

(按重試以調試應用程序)ConsoleApplication3.exe有 觸發了一個斷點。

Debug Assertion Failed!

計劃: ... 15 \項目\ ConsoleApplication3 \調試\ ConsoleApplication3.exe文件: minkernel \ CRT顯示器\ ucrt的\ src \ appcrt \轉換\ isctype.cpp行:42

表達:C> = -1 & &ç< = 255

有關您的程序如何可以導致斷言失敗的信息, 看到斷言在Visual C++文檔。

(按重試以調試應用程序)ConsoleApplication3.exe有 觸發了一個斷點。

程序'[13188] ConsoleApplication3.exe'已退出,代碼爲0 (0x0)。

+5

您有一個100個字符的數組,但您正在訪問字符編號101.您也可能會超出輸入的字符串,因爲您不檢查字符串終止符,從而訪問未初始化的內存。很抱歉,您對輸入沒有任何限制,這意味着用戶可能會向陣列中寫入超過100個字符。所有這些問題導致*未定義的行爲*。 –

+0

你可以停在第一個空方式遇到的字符。但消息很有趣。一個字符怎麼能'c> = -1 && c <= 255'失敗? –

+0

而未被'scanf'填充的數組部分未初始化,因此檢查其值是沒有價值的。 –

回答

1

更改此:

for (i = 0; i <= 100; i++) { 

for (i = 0; i < 100 && password[i] != '\0'; i++) { 
       ^^^  ^^^^^^^^^^^^^^^^^^ 
     note: no =  check for end of string 

char password[100]; 

所以法律指數只有0〜99另外,你需要檢查,如果你已達到字符串的結尾(又名密碼[I]!= '\ 0')

做你想要達到的目標(通過@讓 - 弗朗索瓦·法布爾啓發)更好的辦法:

 scanf("%99s", password); 
      ^^ 
      To prevent buffer overflow 

    for (i = 0; i < strlen(password); i++) { 
     .... 
+1

正確的循環將在第一個NULL字符處停止,並且不會一直延伸到100個字。 – PaulMcKenzie

+0

@PaulMcKenzie - 正確。謝謝。答案已更新。 – 4386427

+0

此更改已解決問題(謝謝!),但我不明白爲什麼。 – Infected

0

變化:

for (i = 0; i <= 100; i++) 

到:

for (i = 0; i < strlen(password); i++) 

注意:如果沒有大寫字母,則表明您已經出邊界。

+0

這是問題,是的。但是,回答相同的事情(但稍微差一些,因爲'strlen'在每次迭代時都會運行字符串)而不是當前正確的現有答案。 –