Salve, sono alle prese con la preparazione dell'esame di Informatica e ieri mi sono imbattuto in un esercizio sui file che mi sta dando problemi.

codice:
#include <stdio.h>#include <stdlib.h>
#include <string.h>


#define R 80
#define N 20
#define P 4


int main(int argc, char *argv[])
{
    if(argc!=2) {
        printf("ERROR");
        return -1;
    }


    struct corso {
        char materia[N];
        char nome[N];
        char cognome[N];
        int periodo;
        int crediti;
        int superamento;
    };


    struct corso insegnamenti[R];


    FILE *f;
    int i = 0, j, k = 0;
    int creditimax = 0;
    int superamentomin[R];
    int somcrediti = 0;
    float mediasuperamenti = 0;
    char riga[R];
    char matcreditimax[R];
    char matsupmin[P][R];
    char insegnante[N];


    for(j=0; j<R; j++) {
        superamentomin[i] = 100;
    }


    f = fopen(argv[1], "r");
    if(fopen(argv[1], "r")==NULL) {
        printf("ERROR");
        return -1;
    }


    while(fgets(riga, R, f)!=NULL) {
        fscanf(f,"%s %s %s %d %d %d", insegnamenti[i].materia,  insegnamenti[i].nome,  insegnamenti[i].cognome,  &insegnamenti[i].periodo,  &insegnamenti[i].crediti,  &insegnamenti[i].superamento);
        if(insegnamenti[i].crediti>creditimax) {
            creditimax = insegnamenti[i].crediti;
            strcpy(matcreditimax, insegnamenti[i].materia);
            i++;
        }
    }


    for(j=0; j<i; j++) {
        switch(insegnamenti[j].periodo) {
            case 1:
            if(insegnamenti[j].superamento<superamentomin[j]) {
                superamentomin[j] = insegnamenti[j].superamento;
                strcpy(matsupmin, insegnamenti[j].materia);
            }
            break;


            case 2:
            if(insegnamenti[j].superamento<superamentomin[j]) {
                superamentomin[j] = insegnamenti[j].superamento;
                strcpy(matsupmin, insegnamenti[j].materia);
            }
            break;


            case 3:
            if(insegnamenti[j].superamento<superamentomin[j]) {
                superamentomin[j] = insegnamenti[j].superamento;
                strcpy(matsupmin, insegnamenti[j].materia);
            }
            break;


            case 4:
            if(insegnamenti[j].superamento<superamentomin[j]) {
                superamentomin[j] = insegnamenti[j].superamento;
                strcpy(matsupmin, insegnamenti[j].materia);
            }
            break;


            default:
            break;
        }
    }


    printf("La materia con piu' crediti associati e' %s con %d crediti.\n", matcreditimax, creditimax);
    for(j=0; j<i; j++) {
        printf("Periodo %d - Materia piu' difficile da superare: %s - Superamento esame %d %.\n", i, matsupmin[i], superamentomin[i]);
    }


    printf("Inserire cognome professore ricercato: ");
    scanf("%s", insegnante);


    for(j=0; j<i; j++) {
        if(strcmp(insegnante, insegnamenti[i].cognome)==0) {
            somcrediti = somcrediti + insegnamenti[i].crediti;
            mediasuperamenti = mediasuperamenti + insegnamenti[i].superamento;
            k++;
        }
    }
    mediasuperamenti = (float) mediasuperamenti/k;


    printf("L'insegnante ricercato segue corsi per un totale di %d crediti e con una media superamento di %f %.", somcrediti, mediasuperamenti);


    fclose(f);
    if(fclose(f)==NULL) {
        printf("ERROR");
        return -1;
    }
    return 0;
}
Al momento della compilazione mi da alcuni errori, tra cui
"c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.6. 1\..\..\..\..\include\string.h|45|note: expected 'char *' but argument is of type 'char (*)[80]'|"

e il warning

"C:\Users\dying_000\Desktop\Polito Informatica\Laboratorio\Settimana 11\Settimana11_Es1\main.c|76|warning: passing argument 1 of 'strcpy' from incompatible pointer type [enabled by default]|"

Tutto questo per i strcpy utilizzati nello switch. Sapresti spiegarmi a cosa può essere dovuto l'errore?