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

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

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

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

Q&A

解決済

5回答

1091閲覧

全要素の比較方法について

Shotayanagi

総合スコア5

C

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

0グッド

0クリップ

投稿2020/08/06 09:45

編集2020/08/06 10:22

ライブラリを使わないで文字列比較を行い同じであればSame、異なればDifferentを表示するプログラムに関してなのですが、以下のコードを実行すると結果が、逆になってしまいます(同じなのにDifferent)。また、performとperformanceを比較するとSameと出てしまい2文字目以降の比較ができません。解決方法分かる方いらっしゃいましたらご回答お願い致します。

int main(void){ //変数宣言// char str1[100]; char str2[100]; int i=0; int imax=100; //文字列の入力// printf("Input str:"); scanf("%s", str1); printf("Input str:"); scanf("%s", str2); //多くとも100回ループし文字列の各要素を比較// for(i=0; i<imax; i++){ //比較するループが終端文字まで同じであればSameを表示// if(str1[i] == '\0' && str2[i]=='\0'){ printf("Same \n"); break; //比較した要素が違った時点でループを終了しDifferentを表示// }else{ printf("Different \n"); break; } } return 0; }

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

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

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

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

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

guest

回答5

0

C

1if (str1[i] == str2[i] == '\0') {

これはどういう意図で記述されていますか?

C

1if ((str1[i] == str2[i]) == '\0') {

つまり、

C

1if ((str1[i] == str2[i]) == false) {

となり、一文字目が不一致なら成立し、一致の場合は成立しません。

投稿2020/08/06 09:49

編集2020/08/06 10:59
SHOMI

総合スコア4079

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

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

Shotayanagi

2020/08/06 10:05

先ほど似ている質問をしてif(str1[i]=='\0' & str2[i]== '\0')と書き換えたのですが、質問に反映させるのを忘れてしまっていました。しかしながら書き換えた後でも2文字目以降が考慮されません…
SHOMI

2020/08/06 10:20

そう書き換えた場合、一文字目が違っていた時点で"Different"を表示してbreakでループを抜けています。
Shotayanagi

2020/08/06 10:38

ご回答ありがとうございます。 一文字目が違う時点でその文字列は同じではない、つまりDifferentかと考えたのですが間違ってますかね…?
SHOMI

2020/08/06 10:58 編集

間違えました。一文字目が合っていた時点で"Different"を表示してbreakでループを抜けています。そうなる理由は回答のとおりです。
Shotayanagi

2020/08/06 13:40

ご返信ありがとうございます! もう少し考えてみます!!
guest

0

自己解決

#include<stdio.h> int main(void){ //変数宣言// char str1[100]; char str2[100]; int i=0; int imax=100; //文字列の入力// printf("Input str:"); scanf("%s", str1); printf("Input str:"); scanf("%s", str2); //多くとも100回ループし文字列の各要素を比較// for(i=0; i<imax; i++){ //比較する要素が異なる時点でループを終了しDifferentを表示// if(str1[i] != str2[i]){ printf("Different \n"); break; //2つの文字列の要素が数終端文字まで同じであればループを終了しSameを表示// }else if(str1[i]=='\0' && str2[i]== '\0'){ printf("Same \n"); break; } } return 0; }

一応できた気がします!!
皆さんありがとうございました!!

投稿2020/08/06 10:33

Shotayanagi

総合スコア5

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

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

0

式の基本を復習しましょう。

str1[i] == str2[i]=='\0'

は、str1[i] == str2[i]は両辺が等しいかどうかで01になり、その値と0の比較です。
ということは==が偽、つまりstr1[i] != str2[i]と同じです。
結果として、等しくない物が見つかった時点でSameが表示されます。

この手の記述は、
str1[i] == str2[i] && str1[i] == \0'
のように分けてANDで繋ぎます。

「nが1以上10以下」を、1<=n<=10と書くのも同類の間違いです。

また、else部分は、等しくない場合のelseなので、等しい物があった時点でDifferentが表示されます。

ちょっと考えれば分かりますが、
・全体が等しいと分かるのでループ終了
・全体が等しくないと分かるのでループ終了
・全体が等しいかどうか分からないのでループ継続して次の文字を見る
と3通りの分岐が必要です。

・文字が等しくて、その等しい文字が'\0'の場合
・文字が等しくて、その等しい文字が'\0'でない場合
・文字が等しくない場合

投稿2020/08/06 09:59

編集2020/08/06 10:03
otn

総合スコア84423

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

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

Shotayanagi

2020/08/06 10:35

ご回答ありがとうございます。 お手数をおかけして申し訳ないのですが、 全体が等しいかわからないのでループ継続の具体的な方法をおしえていただけませんか??
otn

2020/08/06 11:17 編集

真剣に考えた上で聞いてますか? それとも、文章の意味がわからないということでしょうか?
Shotayanagi

2020/08/06 13:41

文章の意味は理解できました。。 もう少し考えてみます。 ご返信ありがとうございます。
guest

0

C

1#include <stdio.h> 2 3int main(void){ 4 //変数宣言// 5 char str1[100]; 6 char str2[100]; 7 int i=0; 8 int imax=100; 9 //文字列の入力// 10 printf("Input str:"); 11 scanf("%s", str1); 12 13 printf("Input str:"); 14 scanf("%s", str2); 15 16 //多くとも100回ループし文字列の各要素を比較// 17 for ( i = 0; i < imax; i++ ) { 18 // 両者が異なれば、ループを抜けてよし。 19 if ( str1[i] != str2[i] ) { 20 printf("Different \n"); 21 break; 22 } else // 両者がいずれも '\0' であればループを抜けてよし。 23 if ( str1[i] == '\0') { 24 printf("Same \n"); 25 break; 26 } 27 } 28 // さて、imax文字比べて違いがなく、終端に達しなかったらどうしよう...(あり得ないなら無問題) 29 if ( i == imax ) { 30 printf("???\n"); 31 } 32 return 0; 33}

投稿2020/08/06 09:57

episteme

総合スコア16614

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

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

Shotayanagi

2020/08/06 10:37

ありがとうございます!! 具体的に書いていただいてとても助かります! 両者がいずれも\0の時に(str1[i]=='\0' && str2[i]=='\0')と書く必要はないのですか??
episteme

2020/08/06 10:59

if ( str1[i] != str2[i] ) { ... } else if ( str1[i] == '\0') { ってなってるから、 str[1] == str[2] なのは確定。だから片っぽが '\0' かの判定で十分。
Shotayanagi

2020/08/06 13:39

なるほど!ご丁寧にありがとうございます!!
guest

0

if(str1[i] == str2[i]=='\0'){

これまちがってます.

#って同じ質問してたよね?

投稿2020/08/06 09:48

編集2020/08/06 09:51
y_waiwai

総合スコア87719

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

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

Shotayanagi

2020/08/06 10:06

先ほど似ている質問をしてif(str1[i]=='\0' & str2[i]== '\0')と書き換えたのですが、質問に反映させるのを忘れてしまっていました。申し訳ございません…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問