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

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

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

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

Q&A

解決済

6回答

2756閲覧

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

suzune

総合スコア8

C

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

0グッド

1クリップ

投稿2018/05/20 03:19

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

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

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

can110

2018/05/20 03:28

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

2018/05/20 08:25

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

回答6

0

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 03:47

PingHermit

総合スコア478

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

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

pepperleaf

2018/05/20 03:50

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

0

ベストアンサー

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

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

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

C

1#include <stdio.h> 2#include <string.h> 3 4#define MAX_NUMBER 5 5#define BUFSIZE 256 6 7int main(void) 8{ 9 char buf[MAX_NUMBER][BUFSIZE]; 10 int n = 0; 11 int i; 12 int max = 0; 13 for(i = 0; i < MAX_NUMBER; i++){ 14 fgets(buf[i],sizeof(buf[i]),stdin); 15 if(n <= strlen(buf[i])){ 16 n = strlen(buf[i]); 17 max = i; 18 } 19 } 20 printf("your character's the longest length is %s",buf[max]); 21 return 0; 22}

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

投稿2018/05/20 05:38

編集2018/05/20 05:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

suzune

2018/05/23 21:33

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

0

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

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

投稿2018/05/20 03:55

episteme

総合スコア16614

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

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

suzune

2018/05/23 21:33

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

0

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

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

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

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

投稿2018/05/20 03:49

katoy

総合スコア22324

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

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

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]
かと。

投稿2018/05/20 03:46

pepperleaf

総合スコア6383

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

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

0

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

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

投稿2018/05/20 03:38

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問