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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Q&A

解決済

1回答

2033閲覧

1行目の文字列と同じ文字列を見つけ、その文字列の(スペースを空けて)隣の文字列を表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

0グッド

0クリップ

投稿2020/09/03 16:24

C言語の問題です。
1行目に星座が、2行目に行数nが与えられます。その次の行からn行の星座(半角スペース一つあけて)血液型のアルファベットが与えられます。
入力例はこのようなものです。
otomeza
4
shishiza O
tenbin O
otomeza AB
mizugameza B

1行目に与えられた星座の血液型のみを出力したいのです。
よってこの場合の出力は
AB
という感じです。
私は(ぐちゃぐちゃになっているかと思います、すみません…)一応以下のように記述しました。

#include <stdio.h> int main(void){ char buf[1000]; int n; char seiza[1000]; char seiza2[100]; char bloodtype[100]; int count = 0; int i; fgets(buf, sizeof(buf), stdin); sscanf(buf, "%s", seiza); //printf("%s\n", seiza); for(i = 0; seiza[i] != '\0'; i++); int length = i; fgets(buf, sizeof(buf), stdin); sscanf(buf, "%d", &n); for(int i = 0; i < n; i++) { fgets(buf, sizeof(buf), stdin); sscanf(buf, "%s %s", &seiza2, &bloodtype); //printf("%s %s\n", naniza, bloodtype); for(int j = 0; j < length; j++) { if(seiza[j] == seiza2[j]) { count++; } } if(count == length) { printf("%s", bloodtype); } } }

明らかに出力がおかしく、ABBAと出たり、他のケースで試すと何も出なくなったり…という感じです。
特に printf("%s", bloodtype); は唐突にbloodtypeを出してきた感じで自分でも変だなと感じるのですが、なかなか直せません。

初心者ではありますが、ご教示いただけますでしょうか。よろしくお願いいたします。

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

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

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

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

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

dodox86

2020/09/03 23:27

前の質問回答が分かっていれば、充分解ける問題だと思うのですが。。。
guest

回答1

0

ベストアンサー

参考:便利な関数があるので関数を使いましょう
C言語入門:文字列を比較する(strcmp)
文字列の比較

#include <string.h> strcmp関数を使うために必要です
if (strcmp(seiza, seiza2) == 0)  文字列同士を比較した結果をif文などで分岐処理させます

※修正
同じなら0を返し、違うと1を返します

wiki strcmp より引用
イメージ説明

C

1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <string.h> //strcmp関数を使うために必要 4 5int main(void) { 6 char buf[1000]; 7 int n; 8 char seiza[1000]; 9 char seiza2[100]; 10 char bloodtype[100]; 11 int count = 0; 12 int i; 13 14 fgets(buf, sizeof(buf), stdin); 15 sscanf(buf, "%s", seiza); 16 17 fgets(buf, sizeof(buf), stdin); 18 sscanf(buf, "%d", &n); 19 20 for (int i = 0; i < n; i++) { 21 fgets(buf, sizeof(buf), stdin); 22 sscanf(buf, "%s %s", &seiza2, &bloodtype); 23 24 // strcmp関数を使った文字列同士の比較 25 if (strcmp(seiza, seiza2) == 0) { 26 printf("%s\n", bloodtype); 27 } 28 } 29 getchar(); 30} 31
// input-output otomeza 4 shishiza O tenbin O otomeza AB AB mizugameza B

投稿2020/09/03 18:53

編集2020/09/04 04:42
mjk

総合スコア303

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

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

dodox86

2020/09/03 23:25

> 同じなら0を返し、違うと1を返します 違う場合は1とは限らないので、非0とでも言いましょうか。第1引数の方が小さければ0より小さい値、第1引数が大きければ0より大きい値、です。
mjk

2020/09/04 04:32

ご指摘ありがとうございます。回答を修正します。
退会済みユーザー

退会済みユーザー

2020/09/21 15:15

ありがとうございます! 無事理解して記述できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問