2016-09-16 6 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はブラウン管を\ \ ucrt \ SRC \ appcrt \ \のisctype.cppライン変換:36

式:C> = -1 & & C < = 255

は、プログラムがアサーションの失敗を引き起こす可能性があります方法については、 はアサート上のVisual C++のマニュアルを参照してください。

(アプリケーションをデバッグするために再試行を押します)ConsoleApplication3.exeには、 がブレークポイントをトリガしています。

デバッグアサーションが失敗しました!

プログラム: ... 15 \プロジェクト\ ConsoleApplication3 \デバッグ\ ConsoleApplication3.exeファイル: minkernelはブラウン管を\ \ ucrt \ SRC \ appcrt \ \のisctype.cppライン変換:42

式:C> = -1 & & C < = 255

は、プログラムがアサーションの失敗を引き起こす可能性があります方法については、 はアサート上のVisual C++のマニュアルを参照してください。

(アプリケーションをデバッグするために再試行を押します)ConsoleApplication3.exeには、 がブレークポイントをトリガしています。

プログラム '[13188] ConsoleApplication3.exe'がコード0 (0x0)で終了しました。

+5

100文字の配列がありますが、文字番号101にアクセスしています。文字列ターミネータがチェックされていないため、初期化されていないメモリにアクセスするため、入力した文字列の外に出ることもあります。あなたは入力に制限がありません。これは、ユーザーがあなたの配列に100文字以上を書く可能性があることを意味します。これらの問題はすべて*未定義の動作*につながります。 –

+0

そして、途中で最初に発生したヌル文字を止めることができます。メッセージは面白いです。 'c> = -1 && c <= 255'はcharに対してどうして失敗するのですか? –

+0

その配列の 'scanf 'で埋められなかった部分は初期化されていないので、その値をチェックすることは無意味です。 –

答えて

1

変更この:

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

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

あなたは

char password[100]; 

を持っているので、法律上のインデックスはあなたかどうかを確認する必要がある唯一の0さらに99までです文字列の終わりに達しました(別名パスワード[私]!= '\ 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'が各繰り返しで文字列を実行するので、少し悪いです)。 –

関連する問題