プロが教える店舗&オフィスのセキュリティ対策術

任意の文字列を入力し、その文字列を昇順にソートするプログラムを作ったのですが、入力する文字の文字数が大きく異なると期待した結果が得られません。
文字数が少なくなったり、他の配列の文字が混ざったりと言う結果に成ってしまっています。
何が原因か分からない状態です。

以下にサンプルを記載させて頂きますので、助言よろしくお願いします。

/*-----------------------------------------
入力例
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
BBBBBBBBBBBBBBBB
AAAAAA
-----------------------------------------*/

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

void swapc(char *cx , char *cy){

char tmp[100];

strcpy(tmp, cx);
strcpy(cx, cy);
strcpy(cy, tmp);
}

int main(){

char *num[100];
char str_tmp[100];//文字列一時格納

int moji_cnt;//入力した文字列のカウント
int n , m;


// 文字列入力処理開始
printf("文字列を入力してください\n");

for( moji_cnt = 0 ; moji_cnt != 3 ; moji_cnt++){
scanf("%s", str_tmp);
*(num+moji_cnt) = (char *)malloc(sizeof(char) * (strlen(str_tmp)+1));//メモリ確保
strcpy(*(num+moji_cnt), str_tmp);
}

puts("\n");

// 文字数ソート処理
for(n = 0 ; n < moji_cnt-1 ; n++){
for(m = 1 ; m < moji_cnt-n ; m++){
if(strcmp(*(num+n) , *(num+n+m)) > 0){
swapc(*(num+n) , *(num+n+m));// 文字列入れ替え
}
}
}

puts("\n");

for(n = 0;n != moji_cnt;n++){
printf("%s\n" , *(num+n));
}

free(num);
}

A 回答 (1件)

こんな風にしたかったのでしょうか。



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

void swapc(char **cx , char **cy)
{
  char *tmp;
  
  tmp = *cx;
  *cx = *cy;
  *cy = tmp;
}

int main(void)
{
  char *num[100];
  char str_tmp[100];    //文字列一時格納
  int moji_cnt;      //入力した文字列のカウント
  int n, m;
  
  // 文字列入力処理開始
  printf("文字列を入力してください\n");
  for (moji_cnt = 0 ; moji_cnt < 3 ; moji_cnt++) {
    scanf("%s", str_tmp);
    num[moji_cnt] = (char *) malloc(sizeof(char) * (strlen(str_tmp) + 1));  //メモリ確保
    if (!num[moji_cnt])
      fprintf(stderr, "outof memory\n"), exit(1);
    strcpy(num[moji_cnt], str_tmp);
  }
  puts("\n");
  
  // 文字列ソート処理
  for (n = 0; n < moji_cnt - 1; n++) {
    for (m = n + 1; m < moji_cnt; m++) {
      if (strcmp(num[n], num[m]) > 0) {
        swapc(&num[n], &num[m]);      // 文字列入れ替え
      }
    }
  }
  puts("\n");
  
  for (n = 0; n < moji_cnt; n++) {
    printf("%s\n", num[n]);
  }
  
  for (n = 0; n < moji_cnt; n++) {
    free(num[n]);
  }
  return 0;
}

(注)インデントのため、全角空白を使っています。
    • good
    • 1
この回答へのお礼

返答遅くなってしまい申し訳ありません
上記のコードですが、まさに私の望んだ動作になりました
配列の文字列を入れ替える際、文字そのものを入れ替えるのではなく、アドレスを入れ替えるようにすれば良かったのですね
大変参考になりました

ありがとうございました

お礼日時:2007/11/06 21:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!