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;
}
よろしくお願いいたします。
お礼
ありがとうございました。 再帰してはいけないんですね。 別の方法でやってみます。