- 締切済み
C言語 ソースを見ていただきませんか? getopt , malloc , qsort の使い方を教えてください。
Linux環境で、ソースを書きましたが、実行すると可笑しくなります。 達人の方々に見ていただきたいのです。 概要: 1. .txt ファイルから、データを読み込み、 サイズを調べ、メモリを確保、 「qsort」で 昇順、降順を出力ファイルに書き出す。 2. 実行すると -ia.txt -oxxx.txt -A [1] 3234 [2] 3445 [3] 5544 -ia.txt -oxxx.txt -D [1] 5544 [2] 3445 ソース #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <search.h> #include <ctype.h> #include <errno.h> typedef struct { fpos_t pos; int val; } Entry; typedef int (CFP)(const void *, const void *); void error(const char *msg){ fprintf(stderr, "%s\n", msg); exit(1); } static int cmpstringp(const void *p, const void *b){ return strcmp(* (char * const *) p, * (char * const *) b); } int main(int argc,char *argv[]) { int iflag = 0; int oflag = 0; int uflag = 0; int v , a , dumy ,b , c , i , ln, sz ; char lines; char *m ; char *s; char *p , *p1 ,*p2 ; char input_file[64]; char output_file[64]; FILE *fp1, *fp2; unsigned long siz; while(( c = getopt (argc, argv, " i:o:AD"))!=-1){ switch (( char ) c ) { case 'i': iflag = 1; strcpy( input_file , optarg ); break; case 'o': oflag = 1; strcpy( output_file , optarg ); break; case 'A': uflag = 1; break; case 'D': uflag = 0; break; default : fprintf(stderr, "usage : command[-Z] [keyword]\n"); exit(1); } } printf( "input=%s output=%s uflag=%d\n" , input_file , output_file , uflag ); fp1 = fopen( input_file, "r" ); if( fp1 == NULL ) { printf( "%sが開けません:%d" , input_file , errno ); return 0; } if ( fseek(fp1, 0L, SEEK_END) == -1L) { printf( "fseek() がエラー:%d" , errno ); return 0; } if ( (siz = ftell(fp1)) == -1L) { printf( "ftell() がエラー:%d" , errno ); return 0; } printf ("siz=%d\n" , siz ); m = ( char * ) malloc ( siz * 2 ); if ( m == NULL ){ printf ("メモリが確保できません\n"); return 0; } if ( fseek(fp1, 0L, SEEK_SET) == -1L) { printf( "fseek() がエラー:%d" , errno ); return 0; } fp2 = fopen( output_file, "w" ); if( fp2 == NULL ) { printf( "%sが開けません:%d" , output_file , errno ); return 0; } lines = 0; p = m; sz = siz; while( 1 ) { if( fgets( p , sz, fp1 ) == NULL ) { break; } ln = strlen( p ); p += ln + 1; sz -= ( ln + 1 ); ++lines; } p = m; for( i=0 ; i<lines ; ++i ) { sz = strlen( p ); printf( "%d : %s\n" , i , p ); p += sz + 1; } for (a = 1; a < 24 ; a++) { for( v = a + 1 ; v < 25 ; v++ ) { if ( p[a] < p[v] ) { dumy = p[a]; p[a] = p[v]; p[v] = dumy; } } } printf("- - 昇順 - -\n"); for ( a = 1; a < 25 ; a++ ) { printf ( "[%d] = %d\n\n", a , p[a]); } qsort ( p , sz , sizeof( char* ), cmpstringp ); for (a = 1; a < 24 ; a++) { for( v = a + 1 ; v < 25 ; v++ ) { if ( p[a] < p[v] ) { dumy = p[a]; p[a] = p[v]; p[v] = dumy; } } } printf ("\n\n"); printf("- - 降順 - -\n"); for ( a = 1; a < 25 ; a++ ) { printf ( "[%d] = %d\n\n", a , p[a]); } exit; fclose (fp1); fclose (fp2); return; } よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
さしあたり、コンパイルエラーが出ないコードを 載せていただけますか?
- Tacosan
- ベストアンサー率23% (3656/15482)
う~ん.... 少なくとも qsort の呼び出し前後は全くダメダメです. なぜ p の中身をバブルソートしてるんでしょうか? また, qsort の呼び出しも, 「文字列をソート」してるんだから第1引数は論理的に char ** (あるいは等価な char *[]) でないと意味をなしません. あと, getopt ループの usage を表示するところも「意味のある」表示をしましょう.
お礼
ご意見ありがとうございます。 もう一回書き直します。
お礼
申し訳ございませんが、また研究中です。