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

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

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

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

Q&A

解決済

3回答

4186閲覧

二つの文字列を比較するプログラム

aiueo12345

総合スコア41

C

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

0グッド

0クリップ

投稿2018/10/30 06:41

編集2018/10/30 06:44

前提・実現したいこと

C言語を用いて二つの英文字列を比較プログラムを書いています。
具体的には、入力した二つの文字列が同じものであれば「0」を表示し、異なれば「1」を表示するプログラムです。

書いたプログラムを以下に記します。

#include <stdio.h> int mystrcmp(char *s1,char *s2); int mystrcmp(char *s1,char *s2) { while((*s1!='\0')&&(*s2!='\0')) { if("*s1++"-"*s2++"!=0) { return 1; } } return 0; } int main(void) { char a[9999],b[9999]; printf("英文字列を二つ入力してください。\n"); printf("一つ目:"); scanf("%s",a); printf("二つ目:"); scanf("%s",b); printf("%d\n",mystrcmp(a,b)); return 0; }

発生している問題・エラーメッセージ

上のプログラムはコンパイル出来たのですが、二つの文字列が同じ場合も異なる場合も「1」が表示されてしまいます。
どこをどう修正すれば正しく判別して「0」を表示させられるでしょうか。

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

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

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

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

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

guest

回答3

0

if文に関する指摘は既にあるので、別な点を。

C

1while((*s1!='\0')&&(*s2!='\0'))

では、どちらかの文字が\0になればループを抜けるようになっています。
abcabcdeのような入力でも「同じ」と判断されてしまうので、
文字数が異なれば即座に「別」とする判定も追加したほうが良いでしょう。

投稿2018/10/30 06:49

dice142

総合スコア5158

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

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

aiueo12345

2018/10/30 10:13

ご回答ありがとうございます。 確かにおっしゃる通りですね。 そこで、文字数を数えてそれらが等しくなければ「1」を返すプログラムを加えてみました。 #include <stdio.h> int mystrcmp(char *s1,char *s2); int mystrcmp(char *s1,char *s2) { int m,n; while(*s1++) m++; while(*s2++) n++; if(m!=n) return 1; while((*s1!='\0')&&(*s2!='\0')) if(*s1++!=*s2++) return 1; return 0; } int main(void) { char a[9999],b[9999]; printf("英文字列を二つ入力してください。\n"); printf("一つ目:"); scanf("%s",a); printf("二つ目:"); scanf("%s",b); printf("%d\n",mystrcmp(a,b)); return 0; } 文字数の判別は上手くいっているようなのですが、今度は文字数が等しく文字が異なるときに「0」を返してしまうようになってしまいました。 新たに加えたこと以外は何も変えていないのですが、何がまずいですか。 別に質問を出すべきか迷ったのですが、もしよければお教えください。
dice142

2018/10/30 10:18

文字数判定で*s1++してるので、文字比較の前にアドレスが移動してしまっています。 ++ではなく別でカウンタ用の変数を用意するか、比較後に両方\0かどうかを判定する必要があります。
aiueo12345

2018/10/30 10:58

返信ありがとうございます! そういうことだったんですね。納得しました。 また機会がありましたらよろしくお願いします。
guest

0

ベストアンサー

if("*s1++"-"*s2++"!=0)

2つの文字列リテラルは別なので恒等式になります。

c

1if(*s1++ != *s2++)

でよいかと


ちなみにこれで充分

c

1while(*s1 == *s2++) 2 if(*s1++ == '\0') return 0; 3return 1;

投稿2018/10/30 06:44

編集2018/10/30 11:27
asm

総合スコア15147

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

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

aiueo12345

2018/10/30 09:25

ご回答ありがとうございます。 上手くいきました! 「if("*s1++"-"*s2++"!=0)」でも同じことをしているように思えますが、恒等式でないとうまくいかないんですね。勉強になりました。 一行であれば「{}」は省略できるということは知っていながら未だになれません。。。非常にシンプルなプログラムが書けるので積極的に使うようにします。
asm

2018/10/30 09:26

"*s1++"はただの「*s1++」と書かれた文字列ですよ
aiueo12345

2018/10/30 09:30

返信早すぎてびっくりしました笑 やっとわかりました! 単に「s1++」と「s2++」を比べて、当然数字部分が異なっているので「1」が出力されていたのですね。 すごく馬鹿なことしてました笑 すっきりしました、ありがとうございます。
Y.H.

2018/10/30 10:22

@asm ちなみにの方ですが、リターン値が逆ですね。
dice142

2018/10/30 10:35

>Y.H.様 あっていれば「0」、異なっていれば「1」なので回答は仕様通りですよ。
Y.H.

2018/10/30 11:22

dice142様 単純に一文字目が異なるときwhileループ抜けて0を返しませんか? 「ちなみにこれで充分」の方のコードです。
asm

2018/10/30 11:26

逆でしたね
dice142

2018/10/30 11:28

> Y.H.様 ああ、たしかにそうですね。。。
Y.H.

2018/10/30 11:29

@asm 細かい突っ込みすみません。修正ありがとうございます!
guest

0

コメント入れときました、考えてみてください。
明らかに変です。

ごめんなさい、1が異なる場合で、0が同じ時の値でしたか。
あってますね。

c

1int mystrcmp(char *s1,char *s2) 2{ 3 while((*s1!='\0')&&(*s2!='\0')) 4 { 5 // 文字の差 != 0 の場合、return 1する 6 // ---> 文字に差がある場合 return 1する 7 if("*s1++"-"*s2++"!=0) 8 { 9 return 1; 10 } 11 } 12 return 0; 13} 14

投稿2018/10/30 06:48

編集2018/10/30 06:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aiueo12345

2018/10/30 09:26

ご回答ありがとうございます。 また機会があればよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問