-1
votes

Comment utiliser des pointeurs pour stocker plusieurs chaînes à l'aide de MALLOC

J'ai essayé de faire un programme pour allouer de manière dynamique la mémoire pour stocker plusieurs chaînes à l'aide de pointeurs, mais cela ne peut pas sembler fonctionner.

#include <stdio.h>
#include<conio.h>

void main()
{
    FILE *fp;
    int num;

    printf("enter no of students");
    scanf("%d",&num);
    char *names = (char*) malloc(num * 100 * sizeof(char));

    printf("enter the names");
    fp = fopen("file.txt","w");

    for (int i = 0; i < num; i++)
    {
        fgets(*(names + i * 100), 100, stdin);
        fprintf(fp, "%s\n", (names + i * 100));
    }

    fclose(fp);

    fp = fopen("file.txt", "r");
    printf("names stored in *ptr");
}


1 commentaires

Vous allouez un tableau seulement. Je crois que vous aviez besoin d'un Char ** noms variable, puis allocation 100 tableaux de 100 espaces ... ou, vous pouvez réutiliser la matrice lors de la lecture de l'entrée ...


4 Réponses :


1
votes

Vous devez avoir une table des pointeurs au char.

char **strtable = NULL
size_t nstrings = 0; 

int addstring(const char *str)
{
    int result = -1;
    char **tmp = realloc(strtable, (nstrings + 1)* sizeof(*strtable));

    if(tmp)
    {
        tmp[nstrings] = malloc(strlen(str) + 1);
        if(tmp[nstrings])
        {
            result = 0;
            strtable = tmp;
            strcpy(tmp[nstrings++], str);
        }
    }
    return result;
}


6 commentaires

Il connaît le nombre d'élèves de sorte qu'il n'a pas à ré-effectivement réalloc sur chaque appel: scanf ("% d", & num); . Il n'a pas non plus besoin d'une fonction séparée pour le faire: il suffit de l'intégrer dans son principal .


Strlen (String) ==> SHLEN (STR)


@Paulogilvie 1. Je lui montraise le chemin, ne donnant pas le code le plus efficace sur la planète. L'efficacité BTW de Realloc dans ce cas est inférieure à marginale. 2. C est la langue de la procédure et c'est une très mauvaise habitude d'intégrer tout en raison. Peut-être que vos programmes ont une massive de 50000 lignes principale et aucune fonction, mais ce n'est pas l'exemple à suivre. Je considère votre commentaire comme un nitpick


@ 4386427 Oui Vous avez raison, alors pourrait éventuellement avoir un éditeur de code normal. Il est temps de passer au 21ème siècle


@P__J__ Vous n'êtes pas sûr de savoir pourquoi vous écrivez ce commentaire pour moi. Je ne fais pas le So Ui. Je viens de vous aider à améliorer votre réponse.


@P__JJ__ Si c'était une remarque générale, pourquoi l'avez-vous marqué pour moi?



1
votes

Je suis d'accord avec la réponse ci-dessus, mais si vous souhaitez conserver la même structure, vous allez

    #include<stdio.h>
    #include<conio.h>
    void main()
    {
    FILE *fp;
    int num;

    printf("enter no of students ");
    scanf("%d",&num);
    char *names=malloc(num*100);


    printf("enter the names\n");
    fp=fopen("file.txt","w");
                fseek(stdin,0,SEEK_END);

    for(int i=0;i<num;i++)
    {

    fgets((names + i * 100), 100, stdin);
    fprintf(fp, "%s", (names + i * 100));
        fseek(stdin,0,SEEK_END);
    }
    fclose(fp);

    fp=fopen("file.txt","r");
    printf("names stored in *ptr");
    fclose(fp);
    }


2 commentaires

1) Veuillez indenter le code correctement. 2) Pourquoi utiliser fseek ?


J'ai utilisé Fsek pour effacer correctement le tampon STDIN après la première entrée 'Num'



2
votes

Vous avez plusieurs problèmes. Tout d'abord scanf code> ne joue pas bien avec fgets code> - il laissera une nouvelle ligne dans le flux d'entrée qui signifie lorsque vous appelez fgets code> ll juste lire ça. Le moyen le plus simple de résoudre consiste à utiliser fgets code> pour lire dans toute la ligne lorsque vous demandez le nombre d'étudiants et sscanf code> pour obtenir le numéro réel comme ceci:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int num;
    char temp[100];

    printf("enter no of students");
    fgets(temp,100,stdin);
    sscanf(temp,"%d",&num);
    char **names=malloc(num*sizeof(char*));


    printf("enter the names");
    fp=fopen("file.txt","w");
    if(fp==NULL)
    {
        printf("Failed to open\n");
        return 1;
    }
    for(int i=0;i<num;i++)
    {
        names[i]=malloc(100);
        fgets(names[i],100,stdin);
        fprintf(fp,"%s\n",names[i]);
    }
    fclose(fp);

    for(int i=0;i<num;i++)
    {
        free(names[i]);
    }
    free(names);

    printf("names stored in *ptr");
}


0 commentaires

1
votes

L'approche la plus simple consiste à déclarer des noms code> comme "un pointeur sur un tableau de 100 caractères" et utilisez un seul masloc. Après cela, vous pouvez simplement accéder au nom individuel à l'aide de noms [i] code>.

comme ceci: p>

printf("enter the names\n");
fp = fopen("file.txt","w");

for (int i = 0; i < num; i++)
{
    char name[100];
    fgets(name, 100, stdin);
    fprintf(fp, "%s", name);
}

fclose(fp);


0 commentaires