只是从头开始,这是一个学校项目。
基本上,该程序确实会创建一个新的数据集“ enimet”,在其中加载一组数据,然后再次使用“ snimet”名称进行加载,并加载新的数据部分。
以下代码在主程序中:
printf("Give the dataset a name: ");
scanf("%s", uusinimi);
pAlkuTulos = analysoiData(pAlku, pAlkuTulos, uusinimi);
TulostaVikaTulos(pAlkuTulos);
然后我要求打印所有数据
TulostaTulos(pAlkuTulos);
这是我遇到问题(打印出来)的部分
void TulostaVikaTulos(SolmuTulos *pAlkuTulos) {
printf("Datasetti Nimiä PitMin PitMax PitKA\n");
while (ptr != NULL) {
printf("%s %7.0f%7.0f%7.0f%6.1f\n", ptr->nimi, ptr->nimia, ptr-> pitmin, ptr->pitmax, ptr->pitKA);
ptr = ptr->NextTulos; } }
.h文件中的峰值:
struct NodeTulos {
char *nimi;
float nimia, pitmin, pitmax, pitKA;
struct NodeTulos *NextTulos;
};
typedef struct NodeTulos SolmuTulos;
void TulostaTulos(SolmuTulos *pAlkuTulos);
所以我基本上是1.创建名为'enimet'的数据集->向其加载数据,2.创建名为'snimet'的新数据集->向其加载数据->打印所有内容。
它应该打印:
enimet 500 3 11 5.1
snimet 500 2 17 7.8
但是它会打印:
snimet 500 3 11 5.1
snimet 500 2 17 7.8
因此,它不会保留'enimet'。
.h中的AnalysoiData
SolmuTulos *analysoiData(Solmu *pAlku, SolmuTulos *pAlkuTulos, char *nimi);
.c
SolmuTulos *analysoiData(Solmu *pAlku, SolmuTulos *pAlkuTulos, char *nimi) {
float i=0;
float kaikki=0;
int lyhin=100, pisin=0;
float ka;
Solmu *ptr = pAlku;
SolmuTulos *ptrTulos, *ptrNew;
while (ptr != NULL) {
kaikki = kaikki + strlen(ptr->nimi);
i++;
if (strlen(ptr->nimi) < lyhin) {
lyhin = strlen(ptr->nimi);
}
else if (strlen(ptr->nimi) > pisin) {
pisin = strlen(ptr->nimi);
}
ptr = ptr->Next;
}
ka = kaikki/i;
ptrNew = (SolmuTulos*)malloc(sizeof(SolmuTulos));
if (ptrNew == NULL) {
perror("Muistin varaus epäonnistui");
exit(1);
}
strcpy(ptrNew->nimi, nimi);
ptrNew->nimia = i;
ptrNew->pitmin = lyhin;
ptrNew->pitmax = pisin;
ptrNew->pitKA = ka;
ptrNew->NextTulos = NULL;
if (pAlkuTulos == NULL) {
pAlkuTulos = ptrNew;
}
else {
ptrTulos = pAlkuTulos;
while (ptrTulos->NextTulos != NULL) {
ptrTulos = ptrTulos->NextTulos;
}
ptrTulos->NextTulos = ptrNew;
}
return pAlkuTulos;
}
答案 0 :(得分:2)
您的程序具有未定义的行为,在该行为中,您尝试将字符串复制到从未初始化的指针引用的内存中。它发生在这里:
ptrNew = (SolmuTulos*)malloc(sizeof(SolmuTulos));
if (ptrNew == NULL) {
perror("Muistin varaus epäonnistui");
exit(1);
}
strcpy(ptrNew->nimi, nimi);
由于nimi
成员的类型为char*
,因此您必须分配足够的内存来接收字符串nimi
。这可以通过以下方式实现:
ptrNew->nimi = malloc(strlen(nimi) + 1);
if (ptrNew->nimi)
strcpy(ptrNew->nimi, nimi);
或者,您可以将结构中的nimi
成员定义为char nimi[20]
。我建议这样做是为了回应您的评论,声明您将uusinimi
定义为20字节的char
数组。因此,您可以将struct NodeTulos
的定义更改为:
struct NodeTulos {
char nimi[20];
float nimia, pitmin, pitmax, pitKA;
struct NodeTulos *NextTulos;
};
您采用哪种方法将完全取决于程序的要求。