🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

2回答

663閲覧

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

kennzi_665

総合スコア4

C

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

0グッド

0クリップ

投稿2020/12/07 16:01

編集2020/12/07 16:02

作成したプログラムが以下です。

int main(void)
{
int i = 1;
char s1[100];
char s2[100];
printf("文字列1を入力してください > ");
gets_s(s1);
printf("文字列2を入力してください > ");
gets_s(s2);
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
for (i = 0;s1[i] != '\0' || s2[i] != '\0';i++)
{
if (s1[i] != s2[i])
{
printf("違う。");
return 0;
}
}
if (s1[i] == s2[i])
{
printf("同じ。");
return 0;
}
}
出力結果が 
abc abc 同じ 
abc dfr 違う
となるプログラムなのでですが、
「同じ間繰り返しており,if文で違うことを調べる意味がなく、どちらかが'\0'なら同じとする」と指摘されました。どのようにすればコメント通りのプログラムになるのでしょうか?
お力をお借りしたいです。よろしくお願いいたします。{・・・・より上を変更するのはなしでお願いします。}

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

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

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

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

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

kazuma-s

2020/12/07 16:40

gets_s(s1); がエラーにならないのが不思議でしたが、 ソースファイルの拡張子を .c ではなく、.cpp にして C++ としてコンパイルしていませんか? 質問のタグが C なのに。
kennzi_665

2020/12/08 05:16

タグが間違っています。申し訳ありません。
guest

回答2

0

ベストアンサー

質問のプログラムに対して、「同じ間繰り返しており,if文で違うことを調べる
意味がなく、どちらかが'\0'なら同じとする」という指摘は間違っています。

質問のプログラムは、2つの文字列のどちらかが終端でない間繰り返しており、
if文で違うことを調べることには意味があります。
ただ、2つの文字列がどちらも終端なら繰り返さないので、
ループを抜けた後に、if文で同じことを調べるのは無意味です。
次のように書くべきです。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i = 1; 6 char s1[100]; 7 char s2[100]; 8 printf("文字列1を入力してください > "); 9 gets_s(s1); 10 printf("文字列2を入力してください > "); 11 gets_s(s2); 12 for (i = 0; s1[i] != '\0' || s2[i] != '\0'; i++) { // どちらも終端なら繰り返さない 13 if (s1[i] != s2[i]) { 14 printf("違う。"); 15 return 0; 16 } 17 } 18 printf("同じ。"); 19 return 0; 20}

「同じ間繰り返し、どちらかが'\0'なら同じとする」コードは次のようになります。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i = 1; 6 char s1[100]; 7 char s2[100]; 8 printf("文字列1を入力してください > "); 9 gets_s(s1); 10 printf("文字列2を入力してください > "); 11 gets_s(s2); 12 for (i = 0; s1[i] == s2[i]; i++) { // 同じ間繰り返す 13 if (s1[i] == '\0') { // 同じなんだから s2[i] も '\0' 14 printf("同じ。"); 15 return 0; 16 } 17 } 18 printf("違う。"); 19 return 0; 20}

これはこれで正しいコードです。

投稿2020/12/07 17:04

kazuma-s

総合スコア8224

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

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

kennzi_665

2020/12/08 05:17

詳しく説明してくれたかずまさんをベストアンサーにしました。二人ともご回答ありがとうございました。
guest

0

ループが終わった時点のif文は必ず成立するので無駄です

if (s1[i] == s2[i])

{
printf("同じ。");
return 0;
}
}

は、

printf("同じ。");
return 0;
}

でよろしいかと

投稿2020/12/07 16:41

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問