質問するログイン新規登録
C

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

Q&A

解決済

2回答

998閲覧

C言語で入力した文字列と一致しているか調べる

komori_k

総合スコア2

C

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

0グッド

0クリップ

投稿2024/05/12 00:50

編集2024/05/12 01:55

0

0

実現したいこと

あなたが食べたい料理の名前と、メニューに載っている料理名が 1 つ与えられるので、食べたい料理に合致するメニューであれば "Yes" を、そうでなければ "No" を出力するプログラムを作成してください。
食べたい料理に合致するメニューとは、メニューの単語の中に食べたい料理名が入っていることを指します。

入力例 1 では、あなたは hamburg を食べたいと思っていて、与えられた料理名は cheese hamburg です。2 つ目の単語が、あなたの食べたい hamburg と一致しているため、"Yes" と出力します。

入力例1
hamburg
2
cheese hamburg

出力例1
Yes

入力例2
apple
4
spicy pizza with pineapple

出力例2
No

発生している問題・分からないこと

以上の問題を解きたいのですが、いくら考えてもよくわかりません。
以下のようなソースコードを書いてみたのですが、結果が出ないです。

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void){ 5 char s[100]; 6 char t[10][100]; 7 int n,i; 8 9 scanf("%s",s); 10 scanf("%d",&n); 11 for(i=0;i<n;++i){ 12 scanf("%s",t[i]); 13 if (strcmp(s, t[i]) == 0){ 14 printf("Yes"); 15 } 16 } 17 return 0; 18}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

以下のようなコードを書いてみたのですが、この場合Noの場合の処理はどうのように書けばいいのでしょうか

補足

特になし

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

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

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

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

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

fana

2024/05/12 01:39

「"Yes" か "No" を出力するものを作れ」なる指定に対して,そのどちらの出力も存在しないコードを「書いてみた」とか,その行動原理が理解できませんが…… とりえあえず文字列の比較というのは > t[i]==s では できない ので,そこらへんから復習されるべきかと見えます.
hiroki-o

2024/05/12 03:15

入力例の2とか4は何ですか? 次に入力する単語数でしょうか? 食べたい料理も、メニューの料理も自分で入力するのですか? 変なUIですね。
jimbe

2024/05/12 06:19

入力例等を見ると、 atcoder の類じゃないでしょうか。
fana

2024/05/13 01:29

Q.あなたが食べたい料理の名前は? A. "apple" 入力例が雑すぎる
guest

回答2

0

ベストアンサー

食べたい料理に合致するメニューであれば "Yes" を、そうでなければ "No" を出力する

よくある問題ですね。
プログラムは時に人の思考方法を知っているかどうかで難易度が変わります。
ご自身この問題のコンピュータ役になった時、どうやって Yes/No を表示するでしょうか。
Yes の場合、プログラムとして書けているように最初から順に一つ々々と比較して一致していたら…となるでしょう。
では No の場合は?
同じ流れなら、最初から一つ々々と比較して一つも一致しなかったら…となるのが自然でしょう。つまり、全てと比較→判断となるのですから、ループの外で (Yes の時の形のように) 判断して表示する形になります。
では何を判断に使えば良いのか。現状のプログラム内に一つも一致しなかったことを示す変数等はありません。
1つの重要なステップアップは、『無いものは作る』です。
たとえば int の flag という変数を用意し、 for の前で 0 に初期化します。for の中でメニューに一致して Yes を表示したら、同時に flag を 1 にするようにします。

c

1 int flag=0; 2 for(int i=0;i<n;++i){ 3 //… 4 if (strcmp(s, t[i]) == 0){ 5 printf("Yes"); 6 flag=1; 7 } 8 }

そうすると for が終わった時、一致したものがあったら flag は 1 になっており、一致したものが無かったら flag は 0 のままになるはずです。
後は、この flag が 0 だったら No を表示することで期待する動作になるのではないでしょうか。

c

1 //… 2 if(flag == 0) { 3 printf("No"); 4 }

上は既存のプログラムの修正を最小にするような内容ですが、もう少し形を整えることが出来ます。
新たに追加した flag 変数は No を表示する為に使いましたが、 Yes を表示することにも使えることに気が付かれるでしょうか。
つまり、for の中の if で一致した時に print するのでは無く、for の外で (No を表示する同じタイミングで) print するのです。

c

1 //一致するものがあるか 2 int flag=0; 3 for(int i=0;i<n;++i){ 4 //… 5 if(strcmp(s,t[i]) == 0){ 6 flag=1; 7 } 8 } 9 //一致状態によって Yes/No を出力 10 if(flag == 1) { 11 printf("Yes"); 12 } else { 13 printf("No"); 14 }

このようにすると一致するかを判断する部分とその結果に基づいて出力する部分が明確になり、プログラムコードとして評価が上がります。
さらに、 flag を found という名前にすることでその変数が何を表すかが明確になります。

c

1 //一致するものがあるか 2 int found=0; 3 for(int i=0;i<n;++i){ 4 //… 5 if(strcmp(s,t[i]) == 0){ 6 found=1; 7 } 8 } 9 //一致状態によって Yes/No を出力 10 if(found) { //if 文は () 内が 0 で無い場合を成立とみなすので、 0 か 1 にしかならない変数なら "==1" は無くても良い 11 printf("Yes"); 12 } else { 13 printf("No"); 14 }

if(found) print ~ が「もし見つかったら~を表示」と見えてくるでしょう。

投稿2024/05/12 05:14

編集2024/05/12 06:17
jimbe

総合スコア13357

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

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

komori_k

2024/05/12 05:26

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

0

scanfでスペースを含んだ文字列を入力できると勘違いしていました。失礼いたしました。
せっかくなので一応動くコードも書いておきます

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void){ 5 char s[100]; 6 char t[100]; 7 int n,i; 8 9 char kotae[2][5] = {"Yes","No"}; 10 int kotae_soeji = 1; 11 12 scanf("%s",s); 13 scanf("%d",&n); 14 for(i=0;i<n;++i){ 15 scanf("%s",t); 16 17 if(strcmp(s,t) == 0){ 18 kotae_soeji = 0; 19 } 20 21 } 22 23 printf("%s", kotae[kotae_soeji]); 24 25 return 0; 26}

--↓間違い--
strcmpは文字コードの大きさを比べているのでstrstrを使ってはいかがでしょうか

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void){ 5 char s[100]; 6 char t[100]; 7 char s2[300] = " "; 8 int n,i; 9 10 scanf("%s",s); 11 strcat(s2, s); 12 13 scanf("%d",&n); 14 for(i=0;i<n;++i){ 15 scanf("%s",t); 16 if (strstr(t,s2)){ 17 printf("Yes"); 18 } 19 } 20 printf("No"); 21 22 return 0; 23}

投稿2024/05/12 14:53

編集2024/05/13 05:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jimbe

2024/05/12 16:31

`strcmp(~)==0` は大きさの差が無い=同じという使い方ですので大きさの比較で問題ありません。 strstr は文字列の中から一致する部分を探すものですので、部分一致(t="ABCD" で s2="BC"とか) で Yes となってしまう場合があり、完全一致が必要な本件では不適当ではないでしょうか。
fana

2024/05/13 01:26

これ,"Yes" が複数回表示されたりとか,常に "No" が表示されたりとかしませんか?
退会済みユーザー

退会済みユーザー

2024/05/13 04:12

コメントありがとうございます。 最初に探したい食材名を入力しその後に入力される料理名の中に最初の食材名が入っていたらYesと出力し終了するというイメージで作りましたが、これだと常にNoが表示される上に料理名は単語ごとに入力されているのでstrcmpを使うべきでした。 とりあえず常にNoと表示されないように直してみます。
jimbe

2024/05/13 04:41

全体の動作としては (s2 の最初をスペースにしていて t にはスペースは入らないので) Yes が表示されることは無く常に No だけになるように見えます。
jimbe

2024/05/13 04:54

>Yesと出力し終了するというイメージ 現状は Yes と出力したら終了するように書かれていません。 なので for ループは最後まで回り、常に No が表示されることになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問