Array of Pointers - временный массив, созданный в том же месте, который изменяет предыдущее значение сохраненного содержимого - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь написать программу, которая могла бы принять ввод (имя, фамилию, счет) от пользователя и распечатать его после того, как все входные данные были такими.

fname1 lname1 : 99
fname2 lname2 : 23
fname3 lname3 : 29
//Note that all of them are input 

Я написал следующая программа, она работает, но печатает последний ввод n раз. Я знаю, в чем проблема, но не знаю, как ее решить. Переменная temp для массивов создается в одном и том же месте каждый раз , и она делает все элементы одинаковыми. Как это исправить?

#include <stdio.h>
#define LENGTH 3

int main() {
    int *score[LENGTH];
    char *fname[LENGTH];
    char *lname[LENGTH];

    for(int i = 0; i < LENGTH; i++){
        printf("Enter name and score of batter %d: ",i);
        char ftemp[10];
        char ltemp[10];
        int tempScore;

        scanf("%s %s %d", ftemp, ltemp, &tempScore);
        fname[i] = ftemp;
        lname[i] = ltemp;
        score[i] = &tempScore;
    }

    for(int i = 0; i < LENGTH; i++){
        printf("%s %s %d\n", fname[i], lname[i], *score[i]);
    }
} 

1 Ответ

0 голосов
/ 08 марта 2020

Я думаю, что вы пытаетесь присвоить ссылку на локальную переменную для Score, FNAME и LNAME. Вы не можете этого сделать, потому что она разрушается при выходе из их области вместо того, чтобы попробовать это

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 3

int main() {
    int *score[LENGTH];
    char *fname[LENGTH];
    char *lname[LENGTH];

    for(int i = 0; i < LENGTH; i++){
        printf("Enter name and score of batter %d: ",i+1);
        char ftemp[10];
        char ltemp[10];
        int tempScore;

        scanf("%s %s %d", ftemp, ltemp, &tempScore);
        fname[i] = malloc(strlen(ftemp) + 1);
        lname[i] = malloc(strlen(ltemp) + 1);
        score[i] = malloc(sizeof(int));

        if(fname[i]==NULL||lname[i]==NULL||score[i]==NULL)
        {
            if(fname[i]!=NULL)
                  free(fname[i]);
            if(lname[i]!=NULL)
                  free(lname[i]);
            if(score[i]!=NULL)
                  free(score[i]);
            printf("Memory Error");
            exit(1);
        }
        else
        {
            strcpy(fname[i],ftemp);
            strcpy(lname[i],ltemp);
            *score[i]=tempScore;
        }
    }

    for(int i = 0; i < LENGTH; i++){
        printf("%s %s %d\n", fname[i], lname[i], *score[i]);
   }
}
...