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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

3422閲覧

文字が一致するか比較するif文がわからない

langhtorn

総合スコア104

C

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/15 13:16

###実現したいこと
文字列s[7]t[7]が一致していたらsame,そうではなくて大文字と小文字の違いだけであったらcase-insentive,これらに該当しなかったらdifferentを出力したい。
以下私の考え方です。
0. 文字が一致している->cnt++
0. 1が一致していないとき、s[i]が大文字でt[i]が小文字のとき、またはs[i]が小文字でt[i]が大文字のとき、それぞれを大文字または小文字変換してそれがt[i]と一致すればカウント->cnsup++またはcnlow++
0. 上記以外になったとき->cdiff++

回りくどい気がしますが私が思いついたのはこの程度です。
###問題点
一致しないカウントのcdiffは何をいれてもカウントが0になってしまう。
printf("もはや全部違う\n");whileの最後のifを通過したかどうか確認してみたが出力されることはなかった。
実行例

s: AbcDe t: AbcDf 一致cnt= 5 大文字小文字cnsup= 0 小文字大文字cnlow= 0 違うcdiff= 0 -------------------------------------------------------------------- 文字列を入力してください s: AbCdE t: AbcDe s[2]が大文字でt[2]が大文字のとき s[3]が小文字でt[3]が大文字の時 s[4]が大文字でt[4]が大文字のとき 一致cnt= 3 大文字小文字cnsup= 2 小文字大文字cnlow= 1 違うcdiff= 0 case-insensitive ------------------------------------------------------------------- 文字列を入力してください s: AbcDe t: AbcDe 一致cnt= 6 大文字小文字cnsup= 0 小文字大文字cnlow= 0 違うcdiff= 0 same

###コード

C

1//文字列の比較1 2 3#include<stdio.h> 4#include<ctype.h> 5 6int main(void) 7{ 8 char s[7],t[7]; 9 printf("文字列を入力してください\n"); 10 printf("s: "); 11 fgets(s,7,stdin); 12 printf("t: "); 13 fgets(t,7,stdin); 14 15 int cnt,cnsup,cnlow,cdiff; 16 cnt=0; 17 cnsup=0; 18 cnlow=0; 19 cdiff=0; 20 int i=0; 21 while(t[i]!='\0'){ 22 if(s[i]==t[i]){ //小文字大文字もすべて一致 23 cnt++; 24 }else if(isupper(s[i])){ //s[i]が大文字で 25 if(islower(t[i])){ //t[i]が小文字の時 26 printf("s[%d]が大文字でt[%d]が大文字のとき\n",i,i); 27 char isi=tolower(s[i]); 28 if(isi==t[i]){ //s[i]を小文字に変換して一致したらOK 29 cnsup++; 30 } 31 } 32 }else if(islower(s[i])){ //s[i]が小文字でt[i]が大文字の時 33 if(isupper(t[i])){ 34 printf("s[%d]が小文字でt[%d]が大文字の時\n",i,i); 35 char isl=toupper(s[i]); 36 if(isl==t[i]){ //s[i]が大文字変換して一致したらOK 37 cnlow++; 38 } 39 } 40 }else{ //もはや文字が違う時 41 printf("もはや全部違う\n"); 42 char isi=tolower(s[i]); //小文字 43 char isl=toupper(s[i]); //大文字 44 45 if(isi!=t[i] || isl!=t[i]) cdiff++; //小文字を大文字に変換しても大文字を小文字に変換しても一致しないとき 46 } 47 i++; 48 } 49 printf("一致cnt= %d 大文字小文字cnsup= %d 小文字大文字cnlow= %d 違うcdiff= %d \n",cnt,cnsup,cnlow,cdiff); 50 if(cnt==6){ //\0を含めて一致している 51 printf("same\n"); 52 }else if(cdiff>0){ 53 printf("differnt\n"); 54 }else if(cnsup>0||cnlow>0){ 55 printf("case-insensitive\n"); 56 } 57 58 return 0; 59}

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

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

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

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

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

guest

回答5

0

if に対応する else が無いところがあるのが問題です。

次のように考えればもっと簡単になります。

2つの文字列のどちらかが終端になるまでループ

  • 大小を無視しても異なれば、different 確定。
  • そうでなくて、一致しなければ case-insensitive の可能性あり。

ループ終了後、

  • different 確定か、どちらかが終端になっていなければ different。
  • そうでなければ、case-insensitive または same。

C

1#include <stdio.h> // printf, puts, fgets 2#include <ctype.h> // tolower 3 4int main(void) 5{ 6 char s[100], t[100]; 7 puts("文字列を入力してください"); 8 printf("s: "); fgets(s, sizeof s, stdin); 9 printf("t: "); fgets(t, sizeof t, stdin); 10 int different = 0; 11 int case_insensitive = 0; 12 int i; 13 for (i = 0; s[i] && t[i]; i++) { 14 if (tolower(s[i]) != tolower(t[i])) { different = 1; break; } 15 if (s[i] != t[i]) case_insensitive = 1; 16 } 17 if (different || s[i] || t[i]) puts("differnt"); 18 else if (case_insensitive) puts("case-insensitive"); 19 else puts("same"); 20 return 0; 21}

投稿2020/07/15 13:57

編集2020/07/15 14:01
kazuma-s

総合スコア8224

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

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

langhtorn

2020/07/16 02:14

ありがとうございます。
guest

0

C

1 if(islower(t[i])){ //t[i]が小文字の時

この if()が falseの時、何もカウントされません。ここで、違うをカウントすべきでは?
また、

C

1 if(isupper(t[i])){

も同様。
なお、入力の最後の \nも比較されてますが、必要?

C

1 }else{ //もはや文字が違う時

ここに来るのは、s[i]が、t[i]に一致せず、英字以外の時ですね。

投稿2020/07/15 13:56

pepperleaf

総合スコア6383

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

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

langhtorn

2020/07/16 02:15

回答ありがとうございます。
guest

0

ベストアンサー

これはif文とelse文の対応(というべきか?)に起因する問題ですね。
PAST2020 Aだと思いますが、その場合入力は英大小文字のみなので、

C

1}else if(isupper(s[i])){ //s[i]が大文字で

英大文字の場合ここでキャッチされ、

C

1 }else if(islower(s[i])){ //s[i]が小文字でt[i]が大文字の時

英小文字の場合ここでキャッチされ、

C

1 }else{ //もはや文字が違う時 2 printf("もはや全部違う\n"); 3 char isi=tolower(s[i]); //小文字

ここに到達することはありません。

これをそのままのコードの構造で解決するのはなかなか面倒なので、アルゴリズムから見直すことにしましょう。
質問者様のやりたかったことは、

  1. s[i] == t[i]なら、cnt++
  2. s[i]が大文字かつt[i]が小文字のとき、tolower(s[i]) == t[i]なら、cnsup++
  3. s[i]が小文字かつt[i]が大文字のとき、toupper(s[i]) == t[i]なら、cnlow++
  4. どの条件も満たさないとき、cdiff++

だと思われますが、この2と3は区別する必要がないのではありませんか?

例えば、もうどちらも小文字に変換してから比較すれば、どちらが元々どうだったか考える必要はありません。

こういうのはどうでしょう。

  1. s[i] == t[i]なら、cnt++
  2. tolower(s[i]) == tolower(t[i])なら、cnlow++
  3. どの条件も満たさないとき、cdiff++

また、もしかすると、カウントする必要すらないのではないでしょうか。

投稿2020/07/15 13:25

編集2020/07/15 13:39
magf

総合スコア212

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

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

langhtorn

2020/07/16 02:16

自分の考えは回りくど過ぎました????ありがとうございます。
guest

0

else if(isupper(s[i])の判定で分岐してしまえば、それ以降のelseに流れることはありません。ということで、「s[i]が大文字で、t[i]と(大小を無視しても)全く違う文字だった」という場合には、何の処理もなされないことになります。

他にも同様に、何の処理も行われないパターンがあります。

投稿2020/07/15 13:22

maisumakun

総合スコア145184

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

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

maisumakun

2020/07/15 13:27

「全く違う」文字数は直接カウントせずに、処理した文字数 - 残りの条件に当てはまった文字数、で算出するのが手軽かと思います。
langhtorn

2020/07/16 02:16

最後のifを判定してくれない理由がよくわかりました。ありがとうございます。
guest

0

C

1//文字列の比較1 2 3#include<stdio.h> 4#include<ctype.h> 5 6int main(void) 7{ 8 char s[7],t[7]; 9 printf("文字列を入力してください\n"); 10 printf("s: "); 11 fgets(s,7,stdin); 12 printf("t: "); 13 fgets(t,7,stdin); 14 15 int cnt,cnsup,cnlow,cdiff; 16 cnt=0; 17 cnsup=0; 18 cnlow=0; 19 cdiff=0; 20 int i=0; 21 while(t[i]!='\0'){ 22 if(s[i]==t[i]){ 23 cnt++; 24 }else if(tolower(s[i])==tolower(t[i])){ 25 cnlow++; 26 }else{ 27 cdiff++; 28 } 29 i++; 30 } 31 //printf("一致cnt= %d 大文字小文字cnsup= %d 小文字大文字cnlow= %d 違うcdiff= %d \n",cnt,cnsup,cnlow,cdiff); 32 if(cnt==6){ //\0を含めて一致している 33 printf("same\n"); 34 }else if(cdiff>0){ 35 printf("different\n"); 36 }else{ 37 printf("case-insensitive\n"); 38 } 39 40 return 0; 41} 42 43/*実行結果 44文字列を入力してください 45s: AbcDe 46t: AbcDe 47same 48----------------------- 49文字列を入力してください 50s: ABcDe 51t: AbcDf 52different 53----------------------- 54文字列を入力してください 55s: AbcDe 56t: ABcdE 57case-insensitive 58*/

投稿2020/07/16 02:17

langhtorn

総合スコア104

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

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

kazuma-s

2020/07/16 02:40

s: abcd t: abcd case-nsensitive 5文字未満は入れてはいけないのですか?
langhtorn

2020/07/16 03:21

条件に長さ5文字と書いてありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問