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

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

ただいまの
回答率

90.83%

  • C

    3218questions

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

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

解決済

回答 6

投稿

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

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.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C言語で配列を使い入力した文字列を逆順に表示するプログラムを作りたく、以下の様なプログラムを作りまし...

    C言語で配列を使い入力した文字列を逆順に表示するプログラムを作りたく、以下の様なプログラムを作りましたがうまく行きません。どこを変えればよいでしょうか?

  • 解決済

    cp -r コマンドのC言語による実装

    前提・実現したいこと ls -r コマンドのC言語のソースコードを参考にして cp -r コマンドを実装しているのですが どこを変えていいのかわかりません… 該当のソー

  • 解決済

    文字列挿入

    いつもお世話になっています。プログC初心者です。文字列について質問させて頂きます。 [Wakamatsu] 0 Aizu [Aizu][Wakamatsu] 11 youn

  • 解決済

    入力された文字列を分割し、配列に文字列を代入

    前提・実現したいこと 入力された文字列から複数の配列に文字列を入れたいです。 また、それを全て出力したいです。 abc,def,ghi abc def ghi 発生して

  • 解決済

    c言語学習中の学生です。

    前提・実現したいこと c言語を学んでいる学生です。 非常に低レベルな質問ですがお願いします。 Windows10でmingwを使っています。 発生している問題・エラーメッセージ

  • 解決済

    シーザー暗号についての問題

    シーザー暗号についての質問です 大文字を3字ずらす小文字を5字ずらすというプログラムを作っています。 ぶち当たった壁が大文字は3字ずらすことは可能なのですが小文字を5字ずらすことが

  • 解決済

    gcry_mpi_t 内の公開鍵をビット列で取り出したい

     gcry_mpi_t 内の公開鍵をビット列で取り出したい libgcrypt1.7.6 を使ってRSA暗号をいじってく中で, gcry_mpi_t型におさまっている公開鍵をビット

  • 受付中

    c言語 文字列を逆順にして出力する

    発生している問題・エラーメッセージ 文字列を逆順にする関数を作成したのですが最後の文字の入れ替えができません。少しいじるとコアダンプと出てしまいます。どなたか解決法を教えてください

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

  • C

    3218questions

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