• 締切済み

C言語のqsortについて

現在、qsortのコードに取り組んでいます。 if (strcmp(ad, "ASC") == 0) { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_u); } else { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_d); } 恐らくこちらのqsortでの第二引数が書き方を間違えていると思うのですが、修正の方法が分からず、どなたか教えて頂けないでしょうか? #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; 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"); int cnt = 0; for (i = 0;i < 1000;i = i + 1) { if (fgets(sin[i], sizeof(sin[0]), fp)) ++cnt; else break; } fclose(fp); printf("ASC or DESC: "); scanf("%s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_u); } else { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_d); } for (i = 0;i < cnt;i = i + 1) { printf("%s", sin[i]); } return 0; }

みんなの回答

回答No.1

1つ訂正、あなたの事を少し誤解してましたので、ごめんね。 それで、qsortですが http://www.cc.kyoto-su.ac.jp/~yamada/ap/qsort.html void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*)) がプロトタイプになってます。 なので、sizeバイトの物が、num個あるか? になるので、 char sin[1000][1000]; 同じ値だと読みにくいので、 char sin[num][size]; って感じですね。 #define SIZE 1000 #define NUM 1000 char sin[NUM][SIZE]; とした場合、qsortは qsort((void *)sin,NUM,SIZE,...); で呼べます。 ただ、このシリーズの質問をした時に最初に言ってる通り、 qsortを使っている限り、解決は遠くなると思ってます。 "2015/04/26 10:20:00, 5 + 6, 11" "2015/04/27 14:30:51, 7 - 6, 1" これの出力を分解するものではないので、大小判定には向いてません。 日付+時間を大きな数字に戻してから判定するのがベターなので return strcmp((char*)a, (char*)d); return strcmp((char*)d, (char*)a); これでは、判定はできないと思われます。 なので、文字列の必要な部分だけをtime_tに変換することを お勧めします。

asai555666
質問者

お礼

ありがとうございました。

関連するQ&A