需要有关C程序功能的帮助

时间:2019-03-04 02:50:27

标签: c

只是从头开始,这是一个学校项目。

基本上,该程序确实会创建一个新的数据集“ 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;
}

1 个答案:

答案 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;
};

您采用哪种方法将完全取决于程序的要求。