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;
}
お礼
すみません 補足の欄に書いてしまいました 大きな勘違いをしていました HeapReAllocはメモリの移動が起こっても、データの内容は消えないのすね VBのReDimのイメージがあったもので、行動してしまいました どうもありがとうございました
補足
移動可能にできない理由はそれまでに、代入したデータの値を変えたくないからです。 >結局自分で再確保してコピーをするのであれば、移動可能にしておくのと同じだと思うのですが。 それは確かにそうですね。移動可能にしてコピーが普通ですか?