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

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

ただいまの
回答率

88.93%

C言語で文字列をアルファベット順にソートする

受付中

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 378

nakaji100327

score 0

前提・実現したいこと

C言語で宣言した配列をアルファベット順にソートをしたいです。
また、strcmp関数を使わずに解きたいです。

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

実行してみると文字列が消えたり違う文字列になります。
**  Before calling namesort  **
name
SAZAE
WAKAME
MASUO
NORISUKE
TARACHAN
KATSUO
NAMIHEI

**  After calling namesort  **
name
SAZAE   CHAN
HAN

UO
E MIHEI

該当のソースコード

//配列の中身をソートするプログラム
#include <stdio.h>
void namesort(char *psmeibo[], int ikosu){
  int i, j;
  char *temp;
  for(i = 0; i < ikosu; i++){
     for(j = 1; j < ikosu; j++){
        if(psmeibo[i] > psmeibo[j]){
           temp = *(psmeibo + i);
           *(psmeibo + i)= *(psmeibo + j);
           *(psmeibo + j) = temp;
        }
    }
  }
}

//メインプログラム
#include   <stdio.h>

#define    NAMELNG  9
#define    NAMECNT  7

    static  char    meibo[NAMECNT][NAMELNG] = {
        "SAZAE   ",
        "WAKAME  ",
        "MASUO   ",
        "NORISUKE",
        "TARACHAN",
        "KATSUO  ",
        "NAMIHEI "
    };

void namesort(char *, int);

int main(void)
{
    int  i;
    char *pcw;


    (void)printf("****  Before calling namesort  ****\n");
    (void)printf("    name  \n");
    for ( i=0 ; i < NAMECNT ; i++ )
   {
        (void)printf("    %-12s\n",meibo[i]);
    }

        pcw = (char *)meibo;
    namesort( pcw, NAMECNT );          /* name-sorting function   */

    (void)printf("\n****  After calling namesort  ****\n");
    (void)printf("    name  \n");
    for ( i=0 ; i < NAMECNT ; i++ )
    {

        (void)printf("    %-12s\n",meibo[i]);
    }
        return 0;
}

試したこと

ポインタを使わず、配列の要素数で指定してもおなじ結果になりました。

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • cateye

    2020/07/05 11:28 編集

    for(j = 1; j < ikosu; j++){はこれで良いのですか?
    NAMECNTは7、文字数は最大9文字有りますが?
    if(psmeibo[i] > psmeibo[j])は。1文字づつの比較になっていますよd^^

    キャンセル

  • episteme

    2020/07/05 12:11

    > strcmp関数を使わずに解きたいです。

    strcmp関数を使ってなら、書けますか?
    それができたら、strcmpを自前の比較関数に置き換えてしまえばいいので。

    キャンセル

  • nakaji100327

    2020/07/05 13:05

    cateyeさん、epistemeさん回答ありがとうございます。

    epistemeさんへ
    strcmp関数を使って書きました。

    #include <stdio.h>
    #include <string.h>
    void namesort(char *psmeibo[], int ikosu){
    int i, j;
    char *temp;
    for(i = 0; i < ikosu; i++){
    for(j = 1; j < ikosu; j++){
    if(strcmp(psmeibo[i], psmeibo[j])){
    temp = *(psmeibo + i);
    *(psmeibo + i)= *(psmeibo + j);
    *(psmeibo + j) = temp;
    }
    }
    }
    }

    キャンセル

  • episteme

    2020/07/05 13:24

    できたんなら、strcmpを自前のに差し替えれば完成ぢゃん。

    キャンセル

回答 2

0

void namesort(char *psmeibo[], int ikosu){
    static  char    meibo[NAMECNT][NAMELNG] = {

meibopsmeiboが別の型な事が問題です。

0 1 2 3 4 5 6
0 S A Z A E    
1 W A K A M E  

0 "SAZAE  "
1 "WAKAME "

の違いがあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/05 12:42

    回答ありがとうございます。
    asmさんの意見を参考にさせていただき、もう一度考え直します。

    キャンセル

0

文字列の比較には、>演算子ではなく、strcmp関数を使いましょう。
複数の文字列データは、2次元配列で持つより、ポインタの1次元配列に
したほうが、ソートが楽になります。

//配列の中身をソートするプログラム
#include <stdio.h>

void namesort(char **psmeibo, int ikosu)
{
    for (int i = 0; i < ikosu; i++) {
        for (int j = 1; j < ikosu; j++) {
            if (strcmp(psmeibo[i], psmeibo[j]) > 0) {
                char *temp = psmeibo[i];
                psmeibo[i] = psmeibo[j];
                psmeibo[j] = temp;
            }
        }
    }
}

//メインプログラム
#include   <stdio.h>

#define    NAMECNT  7

static char *meibo[NAMECNT] = {
    "SAZAE",
    "WAKAME",
    "MASUO",
    "NORISUKE",
    "TARACHAN",
    "KATSUO",
    "NAMIHEI"
};

void namesort(char **, int);

int main(void)
{
    printf("****  Before calling namesort  ****\n");
    printf("    name  \n");
    for (int i = 0; i < NAMECNT; i++)
        printf("    %-12s\n", meibo[i]);

    namesort(meibo, NAMECNT);        /* name-sorting function   */

    printf("\n****  After calling namesort  ****\n");
    printf("    name  \n");
    for (int i = 0; i < NAMECNT; i++)
        printf("    %-12s\n", meibo[i]);
    return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/05 13:09

    kazuma-sさん、回答ありがとうございます。
    kazuma-sさんのおっしゃる通り2次元配列だと複雑で、やりにくいですね。

    キャンセル

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

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

関連した質問

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