• 締切済み

C言語の課題に取り組んでいるんですが・・・

まだプログラムの勉強をはじめた初心者なのですが、 テキストファイルから文字を読みこみ、大文字ならば小文字に変換し辞書順に並びかえるプログラムを作っているのですがどうしてもうまくいきません。 例えばtest.txtに XXX YYY YY XX BBB aaa aa BB とあれば aa aaa bb bbb xx xxx yy yyy と表示されるよにしたいんです。 自分が作ったプログラむはこれです。 まだテキストファイルからでなくキーボードからの入力になっていますが・・・ #include<stdio.h> #include<stdlib.h> #include<string.h> #include <ctype.h> int soto( const void *x, const void *y); int main(int argc, char *argv[]){ FILE *input; char str1[1000]; int i, j; for (i = 1; i < argc; i++){ qsort(argv[i], 1000, sizeof( char *), soto); strcpy(str1, argv[i]); for(j = 0; j < 100; j++){ str1[j] = tolower( str1[j] ); } printf("%s\n", str1); } return 0; } int soto( const void *a, const void *b){ char *x, *y; x = (char*)a; y = (char*)b; return x-y; } これだと小文字にはなるんですがソートされずに表示されてしまいます・・・ どのようにすればいけるのかご指摘のほどおねがいします

みんなの回答

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.2

qsort 関数は、ソートしたい要素が一定サイズ・かつ連続的に並んでいるものとして、その中身を並び替えます。 例えば、int x[100] という配列があったとすると、メモリ上のx[0]が格納されているアドレスから、sizeof(int) バイト毎に値が入っているので、単純に (int *)a と (int *)b を比較すれば済みます。 しかしここで。 C言語における文字列とは、(char) の配列なのです。 従って、文字列の配列とは、(char *) の配列なのです。 その soto 関数では、文字列の、格納アドレスを比較していることになってしまいます。 (本当の順番はわかりませんが)文字列を読み込んだ順にメモリに格納していかれたとすると、はじめの方ほど若いアドレスに配置されていき、それを、若い順にソートするのだから、結果的に全くソートされません。 soto 関数の中で、2つの文字列を一文字ずつ比較していき、大小判定するか、strcmp関数で比較すると良いでしょう。 あと、ソートしてから小文字化してるみたいですが、先に小文字化しないと、英大文字が先に来ちゃいますよ。 まあ、比較関数の方でstricmp関数をつかってもいいんですが。

回答No.1

soto() は、(char *)型を文字ポインタとして比較しています。 文字列として比較するには、 strcmp()を使います。 関連項目 #include <string.h> int strcmp(const char *s, const char *t); int strncmp(const char *s, const char *t, size_t n); int stricmp(const char *s, const char *t); int strcmpi(const char *s, const char *t); int strnicmp(const char *s, const char *t, size_t n); int strncmpi(const char *s, const char *t, size_t n);

関連するQ&A