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

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

ただいまの
回答率

90.54%

  • C

    4377questions

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

  • C++

    4302questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    2287questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows

    1676questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

セットした複数文字列の中から一番長い文字列の文字数を返す関数を作りたい

解決済

回答 4

投稿

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

Iwan

score 21

セットした文字列配列の中から一番長い文字列を調べその文字数を
返す関数を作りたいのですがどう設計すれば良いか分からず
質問させて頂きました。

考えているイメージとしては例)になりますが
{ "あ", "あい", "あいう", "あいうえ", "あいうえお" }
上記の様な複数文字列を引数として渡し、その中で
一番長い文字列を調べその文字数(1バイト算出)を返す関数を
作りたいです。

出来れば特定のシーンだけの使用ではなく汎用性がある関数
をイメージしています。

構造体等の使用は考えていないです。
可能ならば日本語文字列も混ざった状態でも調べられるものをイメージしています。

説明に分かり辛い部分があったら質問して頂ければと

<開発環境>
Windows7
Visual Studio2013

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+3

下記コードのような感じでしょうか?一般化のため「文字数」ではなく「要素を指すイテレータ」を返しています。

#include <algorithm>
#include <string>
#include <vector>
#include <iostream>

typedef std::vector<std::string> StrVec;

StrVec::iterator find_longest(StrVec& vec)
{
  return std::max_element(vec.begin(), vec.end(),
                          [](const std::string& s, const std::string& t) {
                            return s.size() < t.size();
                          });
}

int main()
{
  StrVec vec = { "あ", "あい", "あいう", "あいうえ", "あいうえお" };

  auto result = find_longest(vec);
  std::cout
    << "result=" << *result << "\n"
    << "length=" << (*result).size() << std::endl;
}

文字数(1バイト算出)を返す
可能ならば日本語文字列も混ざった状態でも調べられるもの

前掲コードでは文字列長をバイト単位で数えています。このため、結果は文字コード方式に依存して変化します。UTF-8ならば"あいうえお"は15バイト、Shift-JIS/EUC等ならば10バイトになると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/10 12:44

    返答が遅くなり大変失礼しました。

    C++の標準ライブラリはまだ勉強中で分からない部分が多々ありまして
    コードをご教授頂いておきながら大変恐縮ですがC++版とは別にC版で
    教えて頂けないでしょうか?

    キャンセル

  • 2017/03/10 17:25 編集

    C言語版は PineMatsu さん回答コードが良いのではないでしょうか。

    C版をC++版と同等設計にすることもできますが、C言語そのものの表現能力が貧弱なので無駄にごちゃごちゃしたコードになってしまいます。C版の一般化は難しい/あまりお勧めしないです。

    キャンセル

  • 2017/03/11 20:57

    承知しました。
    教えて頂きありがとうございます。

    キャンセル

checkベストアンサー

+2

C言語ならこんな感じの関数を作るかな。

int getStrlength(char* arry[], int size)
{
    int len = 0;
    for (int i = 0; i < size; i++) {
        int n = strlen(arry[i]);
        if (len < n) {
            len = n;
        }
    }
    return len;
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/10 12:11

    返答が遅くなり大変失礼しました。

    質問なのですが10個の文字列リストだったらint sizeは10と言う感じで
    int sizeは配列の数という認識で大丈夫でしょうか?

    キャンセル

  • 2017/03/10 16:47

    そうです。char *arry[]だけでは配列のサイズがわからないので、サイズも一緒に引数として渡すことになります。
    C++でvectorコンテナなどを使えば、コンテナのオブジェクトがサイズを知ってるので引数としてサイズを渡す必要はなくなります。

    キャンセル

  • 2017/03/10 18:35

    なるほど、教えて頂きありがとうございます。

    キャンセル

+1

汎用性を求めるなら、僕ならこうする。

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

/* 長い方を返す */
const char* max_len(const char* strx, const char* stry) {
  return strx == NULL ? stry : (strlen(strx) > strlen(stry) ? strx : stry);
}

int main() {
  const char* data[] = { "あ", "あい", "あいう", "あいうえ", "あいうえお" } ;

  /* 以下のloopを抜けたとき、最も長い文字列がresultに得られる */
  const char* result = NULL;
  for ( int i = 0; i < 5; ++i ) {
    result = max_len(result, data[i]);
  }

  printf("loggest string: %s\n", result);
  return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/11 14:18

    コードを掲示頂いてありがとうございます。

    掲示コードですと文字列の数自体は調べていないので別に作ると言う事ですか?

    キャンセル

  • 2017/03/11 21:51

    です。文字列の集合が配列ばかりとは限らんのであれば。

    キャンセル

0

単純にループ内ですべての文字列をカウント比較するか、文字列数を確認することができれば(例えばArray...Lenght)して、最後に残った文字列数を返り値とすればいいのではと。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C

    4377questions

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

  • C++

    4302questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    2287questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows

    1676questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。