質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

778閲覧

C言語自作関数の練習をしています

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/07/09 03:11

パスワードの入力判定について自作関数を作っています

ルール
①八文字以上②大文字、小文字、記号、数字が入っていないといけない→全て当てはまるとOKが出る

実行するとどの値を入力してもOKしか出てきません
考えてみましたが何がいけないのかよくわかりません。。

#include<stdio.h> void check(char MOJI[100]) { int i=0,oomoji,komoji,suuji,kigou; while(MOJI[i]!='\0') //何文字であるか判定// { i++; } for(i=0;i;i++) //文字の種類を判定// { if(MOJI[i]>='A'||MOJI[i]<='Z') oomoji++; else if(MOJI[i]>='a'||MOJI[i]<='z') komoji++; else if(MOJI[i]>='0'||MOJI[i]<='9') suuji++; else kigou++; } //OKかNGかの判定// if((oomoji>0)||(komoji>0)||(suuji>0)||(kigou>0)||(i<=8)) { printf("OK"); } else { printf("NG\n\nREASON:"); if(i<=7) printf("word count do not have enough\n"); if(oomoji==0) printf("oomoji is not inputed\n"); if(komoji==0) printf("komoji is not inputed\n"); if(suuji==0) printf("suuzi is not inputed\n"); if(kigou==0) printf("kigou is not inputed\n"); } } //main関数の始まり// int main() { char moji[100]; printf("please input your password\n\n"); printf("password:"); scanf("%s",moji); check(moji); } ```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

色々とありますが、

while(MOJI[i]!='\0') //何文字であるか判定//

このループで、何文字か調べてるようですが、次の for()で、i=0 としているので、i の値は、 0 にされます。 (文字数を保持する変数を用意すべきでしょう)

for(i=0;i;i++) //文字の種類を判定//

for() の文法を確認してください。
最初のi=0 は、初期化、次の i は、ループの条件。ここが、true(≠0)の間、ループします。 最初に i は、 0になっているため、1回もループしません。

if((oomoji>0)||(komoji>0)||(suuji>0)||(kigou>0)||(i<=8))

全て || なので、どれか一つ trueならば、if()は、真となります。 その前の for()が一度もループしていないので、i=0 従って、常に "OK" となるでしょう。 && かと。

なお、すでに指摘があるように、 oomoji,komoji,suuji,kigou の変数は、式化されていないため、値は不定です。 0に初期化する必要があります。

また、指摘がありますが、ctype.h をインクルードすることで、文字の判定が行えます。 (isdigit() : 数字の判定、 isuppper() : 大文字(英字)、 islower(): 小文字(英字) 等)  strlen()(string.h) で、文字長さ。
等々。

投稿2020/07/09 12:14

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではないですが・・・
文字の判定は、ctype.hをインクルードして判定しましょう。

投稿2020/07/09 03:28

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何文字であるか?
→ strlen関数を使いましょう。
【追記】8文字以上あるかのチェックがありませんよ。

oomoji,komoji,suuji,kigouが初期化されないままインクリメントされています。
→forループの前に0で初期化しましょう。
全てOKとなる原因はこれだと思います。

投稿2020/07/09 03:17

編集2020/07/09 03:41
DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int i=0,oomoji,komoji,suuji,kigou;

ローカル変数というのはデタラメの値が入ってます。
なので、使う前にはきちんと初期化(なんかの値を入れておく)しないといけません。

for(i=0;i;i++) //文字の種類を判定//

これ、おかしいです
どういう動作になるか考えてみましょう

投稿2020/07/09 03:17

編集2020/07/09 03:26
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/09 04:24

iがゼロからiまでということではないんですか? そう書きたい場合どうすればいいのでしょう?? 勉強不足ですいません。。
y_waiwai

2020/07/09 04:27

iにゼロいれたら、iはゼロになりますよ。
y_waiwai

2020/07/09 04:30

同じ変数でやろうとするからおかしくなります 別の変数でやりましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問