J'ai une affectation à prendre et à stocker une chaîne à l'aide d'une fonction, cependant, j'ai des restrictions.
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 p>
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. P> basé sur mon code maintenant, lorsque je saisis mais je ne sais pas comment stocker chaque caractère dans une matrice dynamique p> p> "bonjour" code>,
La sortie sera p>
3 Réponses :
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 pour chaque caractère que j'ai lu, i incrément 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>
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;
}
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 code> 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)); code> reconsidérer
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 et utilisation - un peu différent de votre p>
premier off, la fonction Vous devez commencer par déclarer une variable alors vous devez stocker le caractère de terminaison nul "\ 0 'dans la mémoire allouée: p> alors vous créez une variable Ensuite, vous augmentez la taille de votre stockage alloué pour accueillir le nouveau caractère: P> 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>
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>
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>
#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;
}
@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.
Je l'ai fait, mais il n'y a pas d'exemples disponibles qui correspond à ma situation directement en soi