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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

2回答

8599閲覧

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

nakaji100327

総合スコア0

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

2クリップ

投稿2020/07/05 02:09

前提・実現したいこと

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

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

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

**** After calling namesort ****
name
SAZAE CHAN
HAN

UO E MIHEI

該当のソースコード

C言語

1//配列の中身をソートするプログラム 2#include <stdio.h> 3void namesort(char *psmeibo[], int ikosu){ 4 int i, j; 5 char *temp; 6 for(i = 0; i < ikosu; i++){ 7 for(j = 1; j < ikosu; j++){ 8 if(psmeibo[i] > psmeibo[j]){ 9 temp = *(psmeibo + i); 10 *(psmeibo + i)= *(psmeibo + j); 11 *(psmeibo + j) = temp; 12 } 13 } 14 } 15} 16 17//メインプログラム 18#include <stdio.h> 19 20#define NAMELNG 9 21#define NAMECNT 7 22 23 static char meibo[NAMECNT][NAMELNG] = { 24 "SAZAE ", 25 "WAKAME ", 26 "MASUO ", 27 "NORISUKE", 28 "TARACHAN", 29 "KATSUO ", 30 "NAMIHEI " 31 }; 32 33void namesort(char *, int); 34 35int main(void) 36{ 37 int i; 38 char *pcw; 39 40 41 (void)printf("**** Before calling namesort ****\n"); 42 (void)printf(" name \n"); 43 for ( i=0 ; i < NAMECNT ; i++ ) 44 { 45 (void)printf(" %-12s\n",meibo[i]); 46 } 47 48 pcw = (char *)meibo; 49 namesort( pcw, NAMECNT ); /* name-sorting function */ 50 51 (void)printf("\n**** After calling namesort ****\n"); 52 (void)printf(" name \n"); 53 for ( i=0 ; i < NAMECNT ; i++ ) 54 { 55 56 (void)printf(" %-12s\n",meibo[i]); 57 } 58 return 0; 59}

試したこと

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

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

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

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

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

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

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

cateye

2020/07/05 02:28 編集

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

2020/07/05 03:11

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

2020/07/05 04: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 04:24

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

回答2

0

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

C

1//配列の中身をソートするプログラム 2#include <stdio.h> 3 4void namesort(char **psmeibo, int ikosu) 5{ 6 for (int i = 0; i < ikosu; i++) { 7 for (int j = 1; j < ikosu; j++) { 8 if (strcmp(psmeibo[i], psmeibo[j]) > 0) { 9 char *temp = psmeibo[i]; 10 psmeibo[i] = psmeibo[j]; 11 psmeibo[j] = temp; 12 } 13 } 14 } 15} 16 17//メインプログラム 18#include <stdio.h> 19 20#define NAMECNT 7 21 22static char *meibo[NAMECNT] = { 23 "SAZAE", 24 "WAKAME", 25 "MASUO", 26 "NORISUKE", 27 "TARACHAN", 28 "KATSUO", 29 "NAMIHEI" 30}; 31 32void namesort(char **, int); 33 34int main(void) 35{ 36 printf("**** Before calling namesort ****\n"); 37 printf(" name \n"); 38 for (int i = 0; i < NAMECNT; i++) 39 printf(" %-12s\n", meibo[i]); 40 41 namesort(meibo, NAMECNT); /* name-sorting function */ 42 43 printf("\n**** After calling namesort ****\n"); 44 printf(" name \n"); 45 for (int i = 0; i < NAMECNT; i++) 46 printf(" %-12s\n", meibo[i]); 47 return 0; 48}

投稿2020/07/05 03:24

kazuma-s

総合スコア8224

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

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

nakaji100327

2020/07/05 04:09

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

0

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

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

0123456
0SAZAE
1WAKAME

0"SAZAE "
1"WAKAME "

の違いがあります。

投稿2020/07/05 02:38

asm

総合スコア15147

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

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

nakaji100327

2020/07/05 03:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問