1
votes

Comment puis-je utiliser un pointeur de caractère et y entrer une chaîne?

Est-il possible de faire cela sans utiliser l'allocation de mémoire dynamique?

#include <stdio.h>

int main() {
    char* str = NULL;
    scanf("%s", str);
    printf("%s\n", str);
}


2 commentaires

Oui, vous pouvez utiliser l'allocation statique, par exemple char str [100];


Cela ressemble à un problème XY


3 Réponses :


0
votes

Par ici:

int main()
{
  char str[100];
  scanf("%s", str);
  printf("%s\n", str);
}


3 commentaires

Que faire si l'utilisateur entre une centaine de caractères ou plus?


@ryyker Eh bien après le titre de la question, l'OP demande une solution sans utiliser l'allocation de mémoire dynamique? alors ...


La réponse de Sourav est soignée, mais utilise toujours l'allocation de mémoire dynamique sous le capot.



6
votes

Il n’existe pas de méthode simple selon la norme C ( C11 ), cependant, POSIX définit le caractère d'affectation-allocation facultatif m dans le cadre du spécificateur de conversion, qui dégage le programmeur de la responsabilité d'allouer Mémoire.

Cependant, sous le capot, cela utilise l'allocation de mémoire dynamique, et vous devez appeler free () sur le pointeur plus tard.

Citant la référence: p>

Les spécificateurs de conversion % c , % s et % [ doivent accepter un caractère d’allocation d’affectation facultatif 'm' , ce qui provoquera l'allocation d'une mémoire tampon pour contenir la chaîne convertie comprenant un caractère nul de fin. Dans un tel cas, l'argument correspondant au spécificateur de conversion doit être une référence à une variable de pointeur qui recevra un pointeur vers le tampon alloué. Le système doit allouer un tampon comme si malloc () avait été appelé. L'application est responsable de la libération de la mémoire après utilisation. S'il n'y a pas assez de mémoire pour allouer un tampon, la fonction positionnera errno sur [ENOMEM] et une erreur de conversion en résultera. Si la fonction renvoie EOF , toute mémoire allouée avec succès pour les paramètres utilisant le caractère d'affectation d'affectation 'm' par cet appel sera libérée avant le retour de la fonction.

Quelque chose comme

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

int main() {
    char* str = NULL;
    scanf("%ms", &str);
    printf("%s\n", str);
    free(str);

    return 0;
}

ferait l'affaire.


1 commentaires

GNU lib C définit également une telle fonctionnalité .



-1
votes

Oui, mais vous allez gaspiller de la mémoire, ou vous risquez une violation de segmentation:

#include <stdio.h> 
int main() { 
     char str[512] = {0} // as suggested by Jabberwocky
     //sprintf(str, "");
     //scanf("%s", str); // protecting the input from more than 511 chars
     scanf("%511s", str);
     printf("%s\n", str); 
}


5 commentaires

Pouvez-vous expliquer le risque? Y a-t-il une solution de contournement? Peut-être une autre fonction qui pourrait être appelée pour entrer la chaîne?


Pourquoi sprintf (str, ""); ? Pourquoi pas str [0] = 0; ou char str [512] = {0}; . Et si l'utilisateur saisit une chaîne de plus de 511 caractères?


Limitez donc l'entrée de scanf à un nombre fixe de caractères. Ou utilisez de préférence des fgets. Ou mieux encore, oubliez d'utiliser stdio.h.


Si l'entrée est supérieure à la "taille de la mémoire tampon" (disons, 511 caractères + fin \ 0), vous allez essayer d'accéder à la mémoire qui n'a pas été allouée à votre processus, et un SEGV (violation de segmentation) se produira. Vous pouvez limiter l'entrée, en utilisant scanf ("% 511s", str);


l'idiome sprintf (str, ""); ou le str [0] = 0 suggéré ne sont pas nécessaires dans ce morceau de code particulier; dans tous les cas, la version sprintf semble plus facile à comprendre. En ce qui concerne la limitation, j'ai mis à jour ma réponse suggérée.