92218


下記の課題に対して「例外がスローされました」との表示が出てしまい、コンパイルに出力がされない状態です。  
どなたか修正点を教えて頂けないでしょうか？

コンソールからパラメータを受け取り、ログを実行時間の昇順/降順に並べ替えて  
コンソールに表示する  
例）ASC を入力

[code]

    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
    
[/code]

例）DESC を入力

[code]

    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
    
[/code]

[code]

    #include <stdio.h>
    #include <time.h>
    #include <string.h>
    #include <stdlib.h>
    
    int cmp_u(const void* a, const void* d) {
        return *(int*)a - *(int*)d;
    }
    
    int cmp_d(const void* a, const void* d) {
        return *(int*)d - *(int*)a;
    }
    
    int main() {
        int num1, num2;
        char op;
        float answer;
        int r,i;
        FILE* fp;
        char a[11];
        char sin[9];
        char ad;
    
        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", &a);
            if (strcmp(a, "no") == 0) {
                break ;
            }
        }
            fclose(fp);
    
            printf("ASC or DESC: ");
            scanf(" %s", &ad);
    
            if (strcmp(a, "no") == 0) {
                qsort(sin, 9, sizeof(int), cmp_u);
            }
            else {
                qsort(sin, 9, sizeof(int), cmp_d);
            }
    
    
            for (i = 0; i < 9; i++) {
                printf("%d\n", sin[i]);
            }
        
            return 0;
    }
    
[/code]


CC BY-SA 4.0
2022-11-14T05:49:08.860
92216
2022-11-14T06:20:27.613
2022-11-14T05:54:14.930
26370
55007
question
c
C言語のコンパイルへの出力について


OSやコンパイラ・IDE等に何を使っているのか分かりませんが、例えばデバッグモードでコンパイルした結果をデバッグ実行などしてみれば、もう少し詳細なエラーメッセージ等が表示されるはずですので、それを基に調べたり直したり出来るでしょう。

今回の件では、抜粋した以下の部分で、3文字または4文字＋終端の`\0`で5文字以上の領域を用意しておかなければならない所を1文字分しか定義していないことで発生しているものでしょう。

[code]

        char ad;
    
            printf("ASC or DESC: ");
            scanf(" %s", &ad);
    
[/code]

該当の`ad`の定義を、1つのcharではなく5文字以上のcharの配列として定義すれば例外は発生しなくなるでしょう。

[code]

        char ad[5];
    
            printf("ASC or DESC: ");
            scanf(" %s", &ad);
    
[/code]

* * *

ただし、提示されたプログラムソースコードでは、ログファイルを読み取り・ソート・表示する部分は未完成(ほぼ作られていない)状態ですので、まだまだ先は長いでしょう。


CC BY-SA 4.0
2022-11-14T06:20:27.613
92218
2022-11-14T06:20:27.613
26370
92216
answer