c - 仅在第一行写入 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;
}
解决方案
简短的回答:
在第 32 行:
int matrice_risposte[iscritti][21];
更改21
为22
解释:
我注意到(从附图中)你有 22 个问题,但声明了一个 21 个元素的数组。在大多数语言中,多维数组是通过序列化实现的。所以 matrice_risposte[1][22] 实际上是 matrice_risposte[2][0]。您没有注意到该错误,因为您首先打印结果,然后用下一轮输入覆盖最后一个结果。
推荐阅读
- android - RecyclerView 中的 RecyclerView 没有 scolling
- php - PHP MySQL 表单 - 以可查看的结果保存到数据库
- macos - 使用动态库中的 rpath
- c# - 强制接口方法的参数为每个类实现的具体类型
- javascript - 动态更新网页上的值
- c# - 如何在 C# 中将 Sqlite 文本读取为日期时间和布尔值?
- kubernetes - GKE Cluster Autoscaler 按时基预创建节点
- gradle - 如何在不修改 settings.gradle 的情况下添加 gradle 项目依赖项
- javascript - 如何从对象键中删除值
- python - python中的正则表达式混淆