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

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

詳細はこちら
C

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

Q&A

解決済

3回答

1627閲覧

for文を使用し、文字列を比べるプログラム

kennzi_665

総合スコア4

C

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

0グッド

0クリップ

投稿2020/11/30 08:05

二つの文字列を比べ、同じもしくは違うと表示するプログラム作成しいたのですが、(例ABC,
ABC 同じ、ABC,DEF 違う)「同じ間繰り返すようにし.どちらかが'\0'なら同じとする」「FOR文が間違っている」と言われたのですがですが、どのように直せばよいでしょうか?お力を貸して頂きたいです。
以下コードです。
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; } return 0;

}
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

for文は間違っていません。

get_s関数は Linux にはないので、Windows でコンパイラが Visual C++ だと
すると、get_s の引数の個数が異なることが問題です。

get_s(s1); を gets_s(s1, 100); に、
get_s(s2); を gets_s(s2, 100); に変更すると、正しく動きます。

if (s1[i] == s2[i]) や printf("同じ。"); のあとの return 0; は不要ですが、
あっても正しく動きます。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i = 1; // 1 に初期化する必要はありませんが 6 char s1[100]; 7 char s2[100]; 8 printf("文字列1を入力 > "); 9 gets_s(s1, 100); 10 printf("文字列2を入力 > "); 11 gets_s(s2, 100); 12 13 for (i = 0; s1[i] != '\0' || s2[i] != '\0'; i++) 14 if (s1[i] != s2[i]) { 15 printf("違う。"); 16 return 0; 17 } 18 printf("同じ。"); // ここでは s1[i] も s2[i] も '\0' 19 return 0; 20}

投稿2020/12/01 00:57

編集2020/12/01 01:07
kazuma-s

総合スコア8224

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

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

0

ベストアンサー

まず繰り返したいfor文に括弧がついていないです。
繰り返したい処理は{}をつけないといけません。
↓これを

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; }

こうしてください。

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; } }

次に今のままだと文字列を比較しているというより、各文字列の一文字目だけ見てfor文から抜けてしまっています。
例) s1 = ABC ,s2 = ADE でも"同じ。"と出る。

// 1回目のループ (i = 0) if (s1[0] != s2[0]) // s1の1文字目とs2の1文字目が違う時 { printf("違う。"); // "違う。"と出力して return 0; // for文から抜け出す } if (s1[0] == s2[0]) // s1の1文字目とs2の1文字目が等しい時 { printf("同じ。"); // "同じ"と出力して..? return 0; // for文から抜け出す..? }

"同じ"と出力するのは良いとして次のreturn 0;でfor文から抜けてしまっているので
合っていようと間違っていようと今のままだと2文字目の判定をしてくれません。
文字が同じだった時にはreturn 0;は不要です。

投稿2020/11/30 08:33

mushipan0929

総合スコア56

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

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

kennzi_665

2020/11/30 08:49

大変詳しくありがとうございます!二人ともベストアンサーにしたいのですがそうも行かないのでより詳しく説明してくださったMUSHIPENさんをベストアンサーにさせていただきます。
kennzi_665

2020/12/07 05:55

ベストアンサーついた後で申し訳ないのですが、「同じ間繰り返しているので,if文で違うことを調べる意味がなく、どちらかが'\0'なら同じとする」と言われたのですがどのようにすればいいか分かりますか?もし、ここで返すのがよくないのなら新しい質問で投稿します。
dodox86

2020/12/07 06:07

>@kennzi_665さん 横からですみませんが、本回答はkennzi_665さんの元のコードに対する間違いと修正案の指摘であり、それに対応して修正したはずであるkennzi_665さんの最終的なコードはどこにも提示されていません。 > 「同じ間繰り返しているので,if文で違うことを調べる意味がなく、どちらかが'\0'なら同じとする」と言われた とありますが、その文面だけ読んでも状況が分からないですね。コードが適切に修正されていないように思え、どうすべきかは誰にも分からないように思います。いったんはBAを付け、納得して質問を閉じたはずなのですから、修正したコードと共に新たに質問を立てるべきと考えます。
kennzi_665

2020/12/07 06:13

そうですよね。焦ってしまいましたアドバイスありがとうございます。
guest

0

forの後に中括弧がないので、forでループする対象は1文のみとなります。

C

1for (i = 0;s1[i] != '\0' || s2[i] != '\0';i++) { 2 if (s1[i] != s2[i]) 3 { 4 printf("違う。"); 5 return 0; 6 } 7} 8if (s1[i] == s2[i]) 9{ 10 printf("同じ。"); 11 return 0; 12}

これは意図したものでしょうか?

投稿2020/11/30 08:18

maisumakun

総合スコア145975

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問