首页 > 解决方案 > 仅在第一行写入 csv 文件时出现错误的矩阵输出 [C]

问题描述

我正在编写一个程序,该程序将每个候选人的用户名和答案作为输入,并将它们打印在 .csv 文件中,如下所示:

name, answer A, answer B,..., answer Z.

每个名字都存储在一个名为的矩阵中nome_cognome
每个答案都存储在一个名为 的矩阵中matrice_risposte

出于某种我忽略的原因,该程序仅为第一个候选人中的最后一个(“Z”问题)打印错误答案。任何其他候选人的所有答案都正确报告。

我试图做的事情:我在不了解问题背后的原因的情况下调试了程序 5 天。我在网上搜索了类似的问题,我试图修改代码,但我无法解决。如果我找不到任何解决方案,我通常会在论坛上写文章作为我最后的机会。

在继续下一个之前,我让用户检查每个候选人的插入答案是否正确。在屏幕上打印答案时,它们会正确报告。当在文件上打印时,它会按照描述发生。

下图清楚地显示了我在说什么 在此处输入图像描述

我为 Paul 输入所有答案为 1,而为 marie 我输入所有答案为 2。

该代码显示了程序在 csv 文件上写入的部分(它被创建)。

FILE *file_risultati; //apertura file di testo
strcat(corso,".csv");
file_risultati=fopen(corso, "w");

for (j=0;j<iscritti;j++){

    p=0;
    while(nome_cognome[j][p]!='\n')
    {
    fprintf(file_risultati,"%c", nome_cognome[j][p]);
    p=p+1;
    }
    fprintf(file_risultati,",");


    for(i=0; i<22; i++)
    {
        fprintf(file_risultati,"%d,", matrice_risposte[j][i]);
    }
    if(j != (iscritti-1)){
        fprintf(file_risultati,"\n");
    }
}
    fclose(file_risultati); //chiusura file di testo

以下代码是完整的程序,因此您可以检查所有内容并验证我所说的内容。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char corso[100];
char acquisizione_nome [40];
char domande[]= "ABCDEFGHIJLMNOPQRSTUVZ";
int iscritti;
int risposta;

int i;
int j;
int k=1;
int p;

// variabili variazione risposta

int modifica_risposta = 1;
int risposta_precedente;
char risposta_modificata;
char domande_min[]="abcdefghijlmnopqrstuvz";

int main()
{
    printf("Program written by Gianluca Gregnol\n\n");
    printf("Raccolta del fabbisogno formativo\n\n");
    printf("Digitare il corso di interesse: ");
    gets(corso);
    printf("Digitare numero di iscritti al corso: ");
    scanf("%d", &iscritti);

    char nome_cognome[iscritti][40];
    int matrice_risposte[iscritti][21];

    // processo di inserimento votazioni //
    for (k=0;k <(iscritti);k++)
    {
        printf("\n iscritto ");
        printf("%d \n\n", k+1);
        printf("nome e cognome: ");
        fflush(stdin);
        fgets(acquisizione_nome,40,stdin);

        for (i=0; i<40; i++)
        {
            nome_cognome[k][i]= acquisizione_nome[i];
        }

        for (i=0; i<22; i++)
        {
            printf("\nvoto della domanda ");
            printf("%c: ", domande[i]);
            scanf("%d", &risposta);

            while (risposta<0 || risposta>3)
            {
                printf("\n VOTO NON VALIDO!\n i voti validi sono: 0,1,2,3\n inserire nuovamente il voto per la domanda ");
                printf("%c:", domande[i]);
                fflush(stdin);
                scanf("%d", &risposta);
            }
            matrice_risposte[k][i]=risposta;

        }

//stampa le risposte attuali per permetterne il controllo
        printf("\nLe risposte attualmente inserite sono: \n");

        for (i=0; i<22; i++)
        {
            printf("%c  ", domande[i]);
        }
        printf("\n");

        for (i=0; i<22; i++)
        {
            printf("%d  ", matrice_risposte[k][i]);
        }

        printf("\nDesideri modificare delle risposte? \n No = 0 \n Si = 1 \n");
        printf("Risposta: ");
        fflush(stdin);
        scanf("%d", &modifica_risposta);


// controlla se l'utente vuole cambiare delle risposte
        while(modifica_risposta == 1){

            printf("\n\nQuale risposta vuoi modificare?\n");
            printf("Risposta: ");
            fflush(stdin);
            scanf("%c", &risposta_modificata);

            for(i=0; i<22; i++){

                if(risposta_modificata == domande_min[i] || risposta_modificata == domande[i]){

                printf("\nIndica il nuovo valore della domanda %c: ", domande[i]);
                fflush(stdin);
                scanf("%d", &risposta);
                while (risposta < 0 || risposta > 3)
                {
                    printf("\n VOTO NON VALIDO!\n i voti validi sono: 0,1,2,3\n inserire nuovamente il voto per la domanda ");
                    printf("%c:", domande[i]);
                    fflush(stdin);
                    scanf("%d", &risposta);
                }
                risposta_precedente = matrice_risposte[k][i] ;
                matrice_risposte[k][i] = risposta;

                printf(" -- Risposta modificata correttamente --\n\n");

                }
            }

            printf("\nDesideri modificare delle risposte? \n No = 0 \n Si = 1 \n");
            printf("Risposta: ");
            fflush(stdin);
            scanf("%d", &modifica_risposta);


        } //main  while

    }

// processo scrittura su file

    FILE *file_risultati; //apertura file di testo
    strcat(corso,".csv");
    file_risultati=fopen(corso, "w");

    for (j=0;j<iscritti;j++){

        p=0;
        while(nome_cognome[j][p]!='\n')
        {
        fprintf(file_risultati,"%c", nome_cognome[j][p]);
        p=p+1;
        }
        fprintf(file_risultati,",");


        for(i=0; i<22; i++)
        {
            fprintf(file_risultati,"%d,", matrice_risposte[j][i]);
        }
        if(j != (iscritti-1)){
            fprintf(file_risultati,"\n");
        }
    }
        fclose(file_risultati); //chiusura file di testo

        return 0;
}

标签: ccsvpointersmatrix

解决方案


简短的回答:

在第 32 行:

int matrice_risposte[iscritti][21];

更改2122

解释:

我注意到(从附图中)你有 22 个问题,但声明了一个 21 个元素的数组。在大多数语言中,多维数组是通过序列化实现的。所以 matrice_risposte[1][22] 实际上是 matrice_risposte[2][0]。您没有注意到该错误,因为您首先打印结果,然后用下一轮输入覆盖最后一个结果。


推荐阅读