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

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

ただいまの
回答率

90.52%

  • C

    3685questions

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

文字列を標準入力して、最も長い文字列を返すプログラムがわからないです…

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 237

suzune

score 2

 前提・実現したいこと

c言語を勉強しています。
以下の問題を解決したいです。
標準入力から5つの文字列を文字列配列の配列に入力し,その中で最も長い文字列を
出力するプログラムを作成せよ.標準ライブラリ関数を利用すること. 

 発生している問題・エラーメッセージ

実行結果:
what is your character?
ab
abs
abst
abstru
abstruct
your character's the longest length is abstruct
your character's the longest length is abstru
your character's the longest length is abst
your character's the longest length is abs
your character's the longest length is ab

 該当のソースコード

#include <stdio.h>
#include <string.h>
#define NUM 5
#define LEN 100

void swapstr(char *s1,char *s2)//文字をswap
{
  char tmp[LEN];
  strcpy(tmp,s1);
  strcpy(s1,s2);
  strcpy(s2,tmp);
}

int main(void){
    char str[NUM][LEN];
    int i,j;
    printf("what is your character?\n");
    for(i=0;i<NUM;i++){
    scanf("%s",str[i]);
    }
   for(i=0;i<NUM;i++){
    for(j=i+1;j<NUM+1;j++){
     if(strlen(str[i])<strlen(str[j])){
     swapstr(str[i],str[j]);
     }
    } 
   }

   printf("your character's the longest length is %s\n",str);

    return 0;
}

 試したこと

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2018/05/20 12:28

    提示コードで「実現したいこと」はできているように見えます。具体的に「発生している問題」を記載ください。

    キャンセル

  • suzune

    2018/05/20 17:25

    入力した文字列がすべて表示されるようになっているため、これを最長の長さの文字列のみ表示されるようにしたいです。

    キャンセル

回答 6

+1

for(i=0;i<NUM;i++){
for(j=i+1;j<NUM+1;j++){

for(i=0;i<NUM-1;i++){
for(j=i+1;j<NUM;j++){

できれば
printf("your character's the longest length is %s\n",str[0]);
とした方が、書式としてはいいと思います。
内容は変わらないので問題ではないですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/20 12:50

    > for(i=0;i<NUM-1;i++){
    こっち見落としていた。

    キャンセル

checkベストアンサー

0

.strlenで文字列を取得し文字列の最大値が更新したときその番号をmaxという変数が記憶するようにしました。

例えば0番目から4番目までの5つの文字列のうち暫定的に2番目の文字列が最大の場合max = 2となります。

この操作をfor文を用いてい繰り返し、最終的なmaxの値のところが答えとなるようにしました。

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

#define MAX_NUMBER 5
#define BUFSIZE 256

int main(void)
{
    char buf[MAX_NUMBER][BUFSIZE];
    int n = 0;
    int i;
    int max = 0;
    for(i = 0; i < MAX_NUMBER; i++){
        fgets(buf[i],sizeof(buf[i]),stdin);
        if(n <= strlen(buf[i])){
            n = strlen(buf[i]);
            max = i;
        }
    }
    printf("your character's the longest length is %s",buf[max]);
    return 0;
}


<入力例>
ab
abs
abst
abstru
abstruct
<出力例>
your character's the longest length is abstruct

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 06:33

    回答、ありがとうございます!

    キャンセル

0

問題がないのでカンです。
scanfの%sによる文字列入力は空白区切りになります。

もし、空白文字を含む文字列を入力させたいのならばfgetsを用いるべきでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

シンプルなバグ

for(j=i+1;j<NUM+1;j++){

NUM+1 => NUM  (indexは、 NUM-1 まで)

printf("your character's the longest length is %s\n",str);

こっちは、結果オーライぽいけど、
str => str[0]
かと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

問題を分解して、ひとずつ順番に動作確認をしてみていってください。

ここは2つの問題に別けられます。(必要に応じてさらに分解し、動作確認していく)

  1. 標準入力から5つの文字列を文字列配列の配列に保存する。

  2. 文字列配列のなかで、一番長い文字列をみつける。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

  for(j=i+1;j<NUM+1;j++){

ループ回しすぎ? j < NUM+1 改め j < NUM でわないかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/24 06:33

    回答、ありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3685questions

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