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

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;
}
よろしくお願いいたします。

A 回答 (2件)

さしあたり、コンパイルエラーが出ないコードを


載せていただけますか?
    • good
    • 0
この回答へのお礼

申し訳ございませんが、また研究中です。

お礼日時:2008/06/12 08:41

う~ん.... 少なくとも qsort の呼び出し前後は全くダメダメです.


なぜ p の中身をバブルソートしてるんでしょうか?
また, qsort の呼び出しも, 「文字列をソート」してるんだから第1引数は論理的に char ** (あるいは等価な char *[]) でないと意味をなしません.
あと, getopt ループの usage を表示するところも「意味のある」表示をしましょう.
    • good
    • 0
この回答へのお礼

ご意見ありがとうございます。
もう一回書き直します。

お礼日時:2008/06/12 08:42

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