前提・実現したいこと
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/ツールのバージョンなど)
for(j = 1; j < ikosu; j++){はこれで良いのですか?
NAMECNTは7、文字数は最大9文字有りますが?
if(psmeibo[i] > psmeibo[j])は。1文字づつの比較になっていますよd^^
> strcmp関数を使わずに解きたいです。
strcmp関数を使ってなら、書けますか?
それができたら、strcmpを自前の比較関数に置き換えてしまえばいいので。
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;
}
}
}
}
できたんなら、strcmpを自前のに差し替えれば完成ぢゃん。