大文字のパスワードを確認するコードを作成しようとしています。 大文字のパスワードを入力すると、プログラムは正常に実行されます(「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)で終了しました。
100文字の配列がありますが、文字番号101にアクセスしています。文字列ターミネータがチェックされていないため、初期化されていないメモリにアクセスするため、入力した文字列の外に出ることもあります。あなたは入力に制限がありません。これは、ユーザーがあなたの配列に100文字以上を書く可能性があることを意味します。これらの問題はすべて*未定義の動作*につながります。 –
そして、途中で最初に発生したヌル文字を止めることができます。メッセージは面白いです。 'c> = -1 && c <= 255'はcharに対してどうして失敗するのですか? –
その配列の 'scanf 'で埋められなかった部分は初期化されていないので、その値をチェックすることは無意味です。 –