プロが教えるわが家の防犯対策術!

C言語の勉強しているものですが、以下の問題がわからなくて困っております。
途中まで作成してみましたが、もっとも長い文字列が複数ある場合に対応できるように作成する方法がわかりません。
差し支えなければ、どなたか教えていただけたら幸いです。
環境は、Windows10,Visual Studio2017


(問題)キーボードから3つの文字列を入力させ、そのうち最も長い文字列を表示するプログラムを作りなさい。ただし、同じ長さの文字列が複数ある場合は、すべて表示すること。


期待される実行結果の例①(最長のものが1つしかない場合)
文字列1:lemon  ← キーボードから入力
文字列2:apple  ← キーボードから入力
文字列3:pineapple  ← キーボードから入力

もっとも長い文字列:
pineapple


期待される実行結果の例②(最長のものが複数の場合)
文字列1:yellow  ← キーボードから入力
文字列2:green  ← キーボードから入力
文字列3:orange  ← キーボードから入力

もっとも長い文字列:
yellow
orange


私が作成したものです↓
#include<stdio.h>
#include<string.h>

#define size 256

void main(){
char s1[size], s2[size], s3[size];
int len1,len2,len3;

printf("文字列1:");
scanf_s("%s", s1,size);
printf("文字列2:");
scanf_s("%s", s2,size);
printf("文字列3:");
scanf_s("%s", s3,size);

len1 = strlen(s1);
len2 = strlen(s2);
len3 = strlen(s3);

if (len1 > len2) {
if (len1 > len3) {
printf("もっとも長い文字列:%s\n",s1);
}
}

if (len2 > len1) {
if (len2 > len3) {
printf("もっとも長い文字列:%s\n", s2);
}
}

if (len3 > len1) {
if (len3 > len2) {
printf("もっとも長い文字列:%s\n", s3);
}
}

}

A 回答 (5件)

システム開発の仕事を30年ほどしていました。



こういった質問をされる方は多いのですが、その多くはプログラム言語で答えとなる処理手順を考えておられていて、日本語で考えることをされておられないようにお見受けします。

どういう入力操作を行うこととし、プログラム内部にどういうデータ領域を用意し、どういう処理手順で入力データを処理したら求める結果が得られるか。そしてその結果をどう表示するか。そこを日本語でしっかり考えまとめることが大変重要です。
プログラム内部に持つデータ構造は使用する言語に依存する場合もありますが、それ以外の部分、処理手順(アルゴリズム)は言語には大きくは依存しないかと思います。特にC言語を含む手続き型言語の場合は。
そのプランが持てていないので「分からない」となっているかと思います。

ザッと考えると基本的には以下のような感じでしょう。
よく考えてませんので漏れは幾つもあるはずですが。(^^;

  -----

前提として以下のデータ領域を用意する。
・最長文字数を格納するデータ
・最長文字列の個数を格納するデータ
・最長文字数を格納するデータ
・最長文字列を格納するデータを3個

処理手順は以下のとおり。(各種エラー判定や詳細処理は除きます)
(1) 上記の各データを初期化する ※使用言語によってはデータ領域の定義で実施可
(2) 以下の処理を3回繰り返す
 1)キーボードから入力された文字列を取り出し文字数を求める
 2)この値が「最長文字数を格納するデータ」の値より長ければ以下の処理を行う。
  2-1)この値を新たに「最長文字数を格納するデータ」に格納する
    ※ 3個ある「最長文字数を格納するデータ」の何処に格納するかには「最長文字列の個数を格納するデータ」を使う
  2-2)「最長文字列を格納するデータ」と「最長文字列の個数を格納するデータ」を初期化する
  2-3)入力文字列を「最長文字列を格納するデータ」に格納する
  2-4)「最長文字列の個数を格納するデータ」をカウントアップする
 3)この値が「最長文字数を格納するデータ」の値と同じならば以下の処理を行う
  3-1)入力文字列を「最長文字列を格納するデータ」に格納する
  3-2)「最長文字列の個数を格納するデータ」をカウントアップする
(3) 「最長文字列の個数を格納するデータ」の値だけ以下の処理を繰り返す
 1)「最長文字列を格納するデータ」の内容を標準出力する

参考まで。
    • good
    • 1

最大文字長を代入する変数を用意する。


int maxlen = 0;

1.s1に文字入力
2.s1の文字数が、maxlenよりも大きければmaxlenの値を更新
3.s2,s3についても、1.2.を行う
4.この段階で、maxlenにはs1~s3の最大文字数が代入されている
5.s1,s2,s3の文字数を順にチェックしていき、maxlenと同じなら表示する
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2017/11/30 13:23

配列を使うのが一般的ですが、


簡単に処理するなら以下のようにしては如何でしょうか

文字列 s1 の長さを調べる
文字列 s2 の長さを調べる
文字列 s3 の長さを調べる
長さの最大数を求める → M
文字列 s1 の長さを調べる / Mと同じなら s1 を表示
文字列 s2 の長さを調べる / Mと同じなら s2 を表示
文字列 s3 の長さを調べる / Mと同じなら s3 を表示
    • good
    • 1
この回答へのお礼

ありがとうございます。

お礼日時:2017/11/30 13:23

簡単な動作確認しかしていませんが、以下のようにしてください。


もし、配列とポインターを既に習っているならもっと簡単になると思いますが、
とりあえず、今回は、力ずくで行う方法です。

#include<stdio.h>
#include<string.h>

#define size 256

void main(){
char s1[size], s2[size], s3[size];
int len1,len2,len3;

printf("文字列1:");
scanf_s("%s", s1,size);
printf("文字列2:");
scanf_s("%s", s2,size);
printf("文字列3:");
scanf_s("%s", s3,size);
len1 = strlen(s1);
len2 = strlen(s2);
len3 = strlen(s3);
if (len1 >= len2) {
if (len1 >= len3) {
printf("もっとも長い文字列:%s\n",s1);
if (len1 == len2){
printf("もっとも長い文字列:%s\n",s2);
}
if (len1 == len3){
printf("もっとも長い文字列:%s\n",s3);
}
return;
}
}

if (len2 >= len1) {
if (len2 >= len3) {
printf("もっとも長い文字列:%s\n",s2);
if (len2 == len1){
printf("もっとも長い文字列:%s\n",s1);
}
if (len2 == len3){
printf("もっとも長い文字列:%s\n",s3);
}
return;
}
}

if (len3 >= len1) {
if (len3 >= len2) {
printf("もっとも長い文字列:%s\n",s3);
if (len3 == len1){
printf("もっとも長い文字列:%s\n",s1);
}
if (len3 == len2){
printf("もっとも長い文字列:%s\n",s2);
}
return;
}
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2017/11/30 13:23

これだと数が増えると、修正する必要がありますから...


まず、各文字列の長さを調べて、配列にでも入れましょう。
次に、一番長い文字列の長さを調べて
その長さの文字列をすべて表示するってどうですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2017/11/30 13:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!