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

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

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

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

Q&A

解決済

2回答

340閲覧

c言語、問題に行き詰まっています(初めての文字列ならyes、既出ならnoと出力したい)

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/08/16 06:20

C言語で問題を解いていますが、なかなかこの問題が解けません。

問題はこのようなものです。
n
c_1
c_2
...
c_n という用に行数n、文字列c_1~c_nが与えられます。

その文字列が初めて出てくるのであればyesを、既出であればnoと出力したいです。

行数を文字列を受け取るところ前はいつも通り記述できました。
このような感じです、
#include <stdio.h>
int main(void){
char buf[1000];
int n;
char str[1000];

fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d\n", &n);

for(int i = 0; i < n; i++) {
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%s\n", &str);
printf("%s\n", str);
}

ところが肝心の「初めてなら」「一度出てきたら」という条件から作れません。間違えている事を承知で配列にして文字列の比較なども考えましたが…↓

for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(str[i] != str[j]) {
printf("YES\n");
}

案の定うまくいきませんでした。

初めての質問で不手際かもしれませんが、ご教授頂けますと幸いです。

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

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

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

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

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

dameo

2020/08/17 23:54

iをn回ループする   a[i]を読み込む   jをi回ループする     a[i]とa[j]が一致する場合       既出なので「No」と表示して抜ける   jのループで一度も一致しなかった場合、「Yes」と表示する というロジックを書ければ出来ると思いますよ
guest

回答2

0

ベストアンサー

文字列の比較は、strcmp()を使うと簡単です。

自分でやりたい場合は、文字列Aと文字列Bのどの文字同士を比較するのか?という事に注目して書くと良いです。

と、その前の問題として、

C

1for(int i = 0; i < n; i++) { 2fgets(buf, sizeof(buf), stdin); 3sscanf(buf, "%s\n", &str); 4printf("%s\n", str); 5}

これだと、1行をとって、strに格納した後、次の行もstrに上書きする、と繰り返すので、
常に最新の行の情報しか格納できず、「今までに出た文字列」との比較はできません。
(あと、sscanfの"\n"は最後に改行が無い場合、誤動作を引き起こす可能性があるので無い方が良い気がします)

今までの文字列との比較を行いたい場合、今までの文字列全てを保存しておいて、それと比較する必要があります。

投稿2020/08/16 06:34

amiya

総合スコア1218

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

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

退会済みユーザー

退会済みユーザー

2020/08/28 13:01

回答ありがとうございます。 恐縮ですがお聞きしたいことがありまして…。 「今までの文字列を保存しておいてそれと比較する」という部分についてもう少し詳しくご教示いただけませんでしょうか。どのような方法を取ると良いのでしょう…?
amiya

2020/08/28 14:12

「初めて出てくる」=「今までに一度も出ていない」ですので、 今までに出た文字列全てと比較したうえで、一つも一致しなければ、それは「初めて出てきた」と判断できます。
guest

0

文字列長の最大値(MaxLengthとします)と文字列数(n)が大きくないならば、先に全てファイル読み込みしたほうが楽です。以下、メモリ確保までのサンプルソースです。動作未確認

C

1//前略 2char *strs; 3 4fgets(buf, sizeof(buf), stdin); 5sscanf(buf, "%d\n", &n);//一行目を読み取って変数nへ格納 6 7strs = (char*)malloc(MaxLength * n); 8 9//後略

投稿2020/08/16 06:28

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問