-2
votes

Créer de manière dynamique une matrice dans c prise en 1 caractère à la fois

J'ai une affectation à prendre et à stocker une chaîne à l'aide d'une fonction, cependant, j'ai des restrictions.

  • uniquement capable d'utiliser GetChartar () à prendre en entrée utilisateur de caractère par caractère
  • aucune hypothèse de longueur de l'entrée (non autorisée à créer une matrice de taille 100 par exemple)
  • non autorisé à lire l'entrée deux fois, par exemple, à l'aide du premier tour de saisie à la taille de la chaîne de comptage, puis demandez à l'utilisateur de saisir à nouveau après avoir créé une matrice de la taille de la chaîne comptée au premier tour.
  • non autorisé à créer un gros tampon de sorte qu'un tampon de taille constante signifie que la mémoire sera gaspillée si l'entrée est de 1 caractère par exemple XXX

    Je n'ai actuellement aucune idée de la façon de stocker le caractère par caractère et de redimensionner dynamiquement un "tableau" comme des vecteurs équivalents en C ++. C n'a pas de vecteurs basé sur mes recherches.

    basé sur mon code maintenant, lorsque je saisis "bonjour" , La sortie sera xxx

    mais je ne sais pas comment stocker chaque caractère dans une matrice dynamique


1 commentaires

Je l'ai fait, mais il n'y a pas d'exemples disponibles qui correspond à ma situation directement en soi


3 Réponses :


1
votes

Vous devriez utiliser Fonction RealLoc , si vous voulez Augmentez de manière dynamique la taille avec chaque nouveau personnage que vous lisez.

Lorsque vous utilisez realloc code>, le contenu du bloc de mémoire est préservé jusqu'au moindre des nouvelles tailles, même si le bloc est déplacé vers un nouvel emplacement. Si la fonction ne parvient pas à allouer le bloc de mémoire demandé, un pointeur NULL est renvoyé. P>

pour chaque caractère que j'ai lu, i incrément buffsize code>, mais je vais allouer Buffsize + 1 code>. Pourquoi? Parce que j'ai besoin d'une position supplémentaire pour le terminateur null. La dernière position libre pour une lettre serait buffsize - 1 code> dans ce cas et que la dernière sera attribuée à la fin de la boucle tandis que la boucle tandis. P>

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

int main(void) {
    size_t buffsize = 0;
    char *buffer = NULL;
    char *temp;
    char input;

    while ((input = getchar()) != '\n') {
        printf("%c\n", input);

        /* Incraese the size & realloc */
        ++buffsize;
        temp = realloc(buffer, (buffsize + 1) * sizeof(char));

        if (!temp) {
            printf("Error reallocating buffer!\n");
            exit(1);
        }

        /* Setting the new read char */
        buffer = temp;
        buffer[buffsize - 1] = input;
    }

    if (buffsize) {
        buffer[buffsize] = '\0';
        printf("Result = [%s]\n", buffer);
    } else {
        printf("Empty input!\n");
    }

    printf("String size=%lu\n", buffsize);

    /* Clean */
    free(buffer);

    return 0;
}


10 commentaires

Merci, totalisez-la maintenant.! Je pensais dans le sens des lignes de doubler la taille de la matrice à chaque fois (comme le fait comment les vecteurs C ++) ... peut-être que c'est plus inefficace?


Tailleof (Char) est toujours 1


@P__JJ__ je sais. Je l'ai mis à des fins didactiques uniquement.


@P__J____ Il serait beaucoup plus apprécié d'énumérer les erreurs afin que je puisse les corriger et ne pas les rendre à l'avenir.


@Adrianpop Vous répondez - et vous avez un UB très élémentaire. Le programme peut échouer instantanément


Et vous avez une autre erreur - qui conduira à la fuite de mémoire si l'allocation a échoué.


@deviljones Si la taille de la mémoire tampon est doublée, vous devriez le redimensionner ensuite pour vous conformer à la condition «sans perte de mémoire».


@P__J__ J'ai mis à jour ma réponse et j'ai ajouté une allocation initiale au cas où l'entrée est une chaîne vide.


@Adrianpop Quelle est cette allocation initiale? Savez-vous comment le realloc fonctionne? Après de nombreuses modifications pas trop bonnes. Toujours une fonction de fonction redondante et une fuite de mémoire potentielle. Vous devriez retravailler votre réponse.


tampon = realloc (tampon, (buffsize + 1) * Tailleof (Char)); reconsidérer



1
votes

Un peu plus générique - fonction qui ajoute un caractère à la chaîne. Initialement le pointeur doit être nul et il le prendra en compte automatiquement xxx

et utilisation - un peu différent de votre xxx


0 commentaires

1
votes

premier off, la fonction getchar () code> retour et int code> pas char * code> Vous ne devez pas affecter sa valeur de retour au pointeur Entrée Code> déclarée dans votre code sous forme Char * Entrée; Code>

Vous devez commencer par déclarer une variable int code>; pourrait être appelé len code>; et l'initialiser avec la valeur de 0 code>. Ensuite, vous devez appeler la fonction masloc () code> et l'alimenter 1 code> pour allouer 1 code> octet de la mémoire pour contenir un seul caractère et attribuer son retour Valeur au pointeur entrée code>, comme les suivantes: p> xxx pré>

alors vous devez stocker le caractère de terminaison nul "\ 0 'dans la mémoire allouée: p> xxx pré>

alors vous créez une variable int code> car la valeur de retour de getchar () code> est int code>. Cette variable qui pourrait être appelée ch code> doit stocker l'entrée de l'utilisateur. P>

Ensuite, vous augmentez la taille de votre stockage alloué pour accueillir le nouveau caractère: P>

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


int main(void)
{
    int len = 0;
    char *input = malloc(1);
    input[0] = '\0';

    int ch;
    while ((ch = getchar()) != '\n')
    {
        input = realloc(input, len + 1);
        input[len] = ch;
        len++;
    }
    input[len] = '\0';

    printf("You entered: %s\n", input);
    printf("Length of str: %d\n", len);

    free(input);
    return 0;
}


1 commentaires

@deviljones J'ai édité la réponse. Auparavant, il y avait peu d'erreurs, mais maintenant, il est totalement correct si vous aimez y revoir.