C言語のqsortについて
下記の課題に取り組んでおり、qsortをファイルの行数分のみ出力するプログラムを書いているのですが
if (strcmp(ad, "ASC") == 0) {
qsort(sin,1000 , sizeof(sin[0]), cmp_u);
if (sin[i][0] == 0) {
break;
}
}
else {
qsort(sin, 1000, sizeof(sin[0]), cmp_d);
if (sin[i][0] == 0) {
break;
}
この書き方ではエラーが出てしまい、どなたか書き方を教えて頂けないでしょうか?
【課題】
電卓アプリケーションの作成
以下の機能を満たすアプリケーションを作成してください。
※画面の表示やログの形式は原則として例示されている内容に従ってください。
1) 四則演算が出来ること
2) コンソールから計算対象となる数値と演算子を受け取る
例) 5 + 6
3) 結果をコンソール上に表示する
例) 11
4) 演算結果と実行した日、時間、秒をログファイルとして保存する
ログの上限は1000行とする(上限を超過するケースはひとまず考慮しなくて良い)
例) log.txt に 以下の内容を記録
2015/04/27 14:30:51, 5 + 6, 11
5) コンソールからパラメータを受け取り、ログを実行時間の昇順/降順に並べ替えて
コンソールに表示する
例) ASC を入力
2015/04/26 10:20:00, 5 + 6, 11
2015/04/27 14:30:51, 7 - 6, 1
2015/04/27 15:30:00, 7 + 8, 15
2015/04/28 14:30:51, 8 + 9, 17
例) DESC を入力
2015/04/28 14:30:51, 8 + 9, 17
2015/04/27 15:30:00, 7 + 8, 15
2015/04/27 14:30:51, 7 - 6, 1
2015/04/26 10:20:00, 5 + 6, 11
【現在のソースコード】
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
static char ad[10];
int cmp_u(const void* a, const void* d) {
return strcmp((char*)a, (char*)d);
}
int cmp_d(const void* a, const void* d) {
return strcmp((char*)d, (char*)a);
}
int main() {
int num1, num2;
char op;
float answer;
int r,i,n;
FILE* fp;
char c[11];
char sin[1000][1000];
char ad[8];
fp = fopen("log.txt", "a+");
if (fp == NULL) {
printf("ファイルオープン失敗\n");
return -1;
}
while (1) {
r = scanf("%d%c%d", &num1, &op, &num2);
if (r != 3) {
puts("input error");
return 1;
}
if (op == '+') {
answer = num1 + num2;
}
else if (op == '-') {
answer = num1 - num2;
}
else if (op == '*') {
answer = num1 * num2;
}
else if (op == '/') {
answer = (float)num1 / num2;
}
time_t t = time(NULL);
struct tm* tm = localtime(&t);
printf("%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec);
printf("%d%c%d,%f\n", num1, op, num2, answer);
fprintf(fp, "%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec);
fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer);
printf("計算を続けますか?");
scanf("%s\n", &c);
if (strcmp(c, "no") == 0) {
break ;
}
}
fclose(fp);
fp = fopen("log.txt", "r");
for (i = 0;i < 1000;i=i+1) {
fgets(sin[i], sizeof(sin[0]), fp);
//if (strcmp(sin, "NULL") == 0) {
if (sin[i][0] == 0) {
break;
}
}
fclose(fp);
printf("ASC or DESC: ");
scanf(" %s", ad);
if (strcmp(ad, "ASC") == 0) {
qsort(sin,1000 , sizeof(sin[0]), cmp_u);
if (sin[i][0] == 0) {
break;
}
}
else {
qsort(sin, 1000, sizeof(sin[0]), cmp_d);
if (sin[i][0] == 0) {
break;
}
}
for (i = 0;i < 1000;i = i + 1) {
if (sin[i][0] == 0) {
break;
}
printf("%s", sin[i]);
}
return 0;
}
お礼
みなさまご回答どうもありがとうございました. リニューアル後少しは改善されてきたようですんで,締め切らせていただこうと思います.ポイントを差し上げられなかった方は申し訳ありません。