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

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

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

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

Q&A

解決済

3回答

1547閲覧

C言語の条件式

d_red

総合スコア161

C

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

0グッド

1クリップ

投稿2016/03/06 00:51

C言語でランダムでパスワードを作成するプログラムを作っています。
大文字と小文字のアルファベットと数字の中から二つ組み合わせるて、指定された数が出力されるものです。
例)英数字と小文字
どれを組み合わせますか?
1:英小文字
2:英大文字
3:数字
(例:1,2)
:1,2

何桁ですか?
:10
JjdwghceAy

・1=もう一回
・2=終了
:
とゆうような流れです。

困っていることは組み合わせるときに、範囲外が指定された時です。範囲外が指定されたら、もう一度入力させるつもりなんですが、なぜかそのまま次の桁を入力するところに流れてしまうのです。当然何も入らないので何も出できません(たまに文字が出力されます)。
条件式が間違ってるのでしょうか?

C

1int plural_number(void) //英文字と数字 2{ 3 char number[10]="0123456789"; 4 char small_alphabet[27]="abcdefghijklmnopqrstuvwxyz"; 5 char big_alphabet[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 6 char combination[37]; 7 int figure,i,select1,select2; 8 srand((unsigned int)time(NULL)); 9 printf("\n***英文字と数字***"); 10 do{ 11 printf("\nどれを組み合わせますか?\n"); 12 printf(" 1:英小文字\n 2:英大文字\n 3:数字\n (例:1,2)\n :"); 13 scanf("%d,%d",&select1,&select2); 14 if(select1==1 && select2==2 || select1==2 && select2==1){ 15 strcpy(combination,small_alphabet); 16 strcat(combination,big_alphabet); 17 } 18 else if(select1==1 && select2==3 || select1==3 && select2==1){ 19 strcpy(combination,small_alphabet); 20 strcat(combination,number); 21 } 22 else if(select1==2 && select2==3 || select1==3 && select2==2){ 23 strcpy(combination,big_alphabet); 24 strcat(combination,number); 25 } 26 else{ 27 printf("error\n"); 28 continue; 29// plural_number(); 範囲外が入力されたら強引に戻す 30 } 31 }while(select1<1 || select1>4 && select2<1 || select2>4); //ここ? 32 do{ 33 printf("\n何桁ですか?(4~20)\n :"); 34 scanf("%d",&figure); 35 printf("\n "); 36 if(figure>=4 && figure<=20){ 37 for(i=0;i<figure;i++){ 38 for(i=0;i<=SHFE;i++) 39 swap(combination,rand()%36,rand()%36); 40 combination[figure]=NULL; 41 printf("%s",combination); 42 } 43 } 44 else{ 45 printf("\n "); 46 printf("Error\n"); 47 } 48 }while(figure<4 || figure>20); 49 printf("\n\n"); 50 menu(); 51 return 0; 52} 53 54void swap(char *num,int x,int y) //並び替え 55{ 56 char tmp; 57 tmp = num[x]; 58 num[x] = num[y]; 59 num[y] = tmp; 60}

いろいろ試したのですがうまくいきませんでした。お願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
bcpadを使用しています

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

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

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

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

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

guest

回答3

0

演算子には優先順位というものがあります。
条件式の中で使っている、&& と || の優先順位を確認してみましょう。

参考:http://www.bohyoh.com/CandCPP/C/operator.html

その上で、

この部分と、

if(select1==1 && select2==2 || select1==2 && select2==1){

こちらの違いを考えてみてください。

}while(select1<1 || select1>4 && select2<1 || select2>4); //ここ?

各変数(select1, select2)に具体的にうまくいかない場合の値を入れて、優先順位に従って式を計算するとどうなるか考えてみると、何が起こっているのか分かると思いますよ。

投稿2016/03/06 01:13

wata

総合スコア70

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

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

d_red

2016/03/06 01:25

ありがとうございます 優先順位を考えてませんでした。
guest

0

ベストアンサー

select1が範囲外
または
select2が範囲外の時
入力を繰り返すのでは?

投稿2016/03/06 01:12

ozwk

総合スコア13521

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

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

d_red

2016/03/06 01:22

ありがとうございます。 たしかにその通りでした
guest

0

気になる所は、
if( select1==1 && select2==2 || select1==2 && select2==1 ){

select1の判定 select2の判定 2つで 1つの条件だと思うので
カッコが必要だと思います。
if( (select1==1 && select2==2) || (select1==2 && select2==1) ){

投稿2016/03/06 01:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

d_red

2016/03/06 01:23

ありがとうございます カッコがなかったのも原因でした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問