chaine de caractere .

chaine de caractere . - C++ - Programmation

Marsh Posté le 27-03-2003 à 01:34:12    

Helou bon je suis relou avec mes questions mais bon ^^ :
voila mon probleme : lors de l'initialisation par exemple char bob[30] le nombre de caractere est fixé .... hors la chaine varie de taille suivant ce que va rentré l'utilisateur , j pourrais mettre char bob[50000000000] pour etre sur mais bon c pas la bonne solution . le nombre de caractere est pas utile dans la suite du programme donc je me fou de savoir que y a 30 ou 50 caracteres (quoi que) . J voudrais juste que le tablo de caractere s'adapte a la longueur du texte que va rentré l'utilisateur . (char bob [] ne marchera pas ?)
Une autre question comment en C dire tout ce qui est apres le caractere '?' et avant le caratere ':' tu le range dans un tablo ?


---------------
un sabre est une arme. le kenjutsu, une technique de mort. Peu importent les bonnes intentions, c'est la seul vérité. On tue pour protéger. On tue pour que d'autres vivent. C'est ca, la vérité du sabre.
Reply

Marsh Posté le 27-03-2003 à 01:34:12   

Reply

Marsh Posté le 27-03-2003 à 08:21:42    

WarmasterCS a écrit :

Helou bon je suis relou avec mes questions mais bon ^^ :
voila mon probleme : lors de l'initialisation par exemple char bob[30] le nombre de caractere est fixé .... hors la chaine varie de taille suivant ce que va rentré l'utilisateur , j pourrais mettre char bob[50000000000] pour etre sur mais bon c pas la bonne solution . le nombre de caractere est pas utile dans la suite du programme donc je me fou de savoir que y a 30 ou 50 caracteres (quoi que) . J voudrais juste que le tablo de caractere s'adapte a la longueur du texte que va rentré l'utilisateur . (char bob [] ne marchera pas ?)
Une autre question comment en C dire tout ce qui est apres le caractere '?' et avant le caratere ':' tu le range dans un tablo ?


 
pour la saisie :
char *bob;
if (gets(bob)!=NULL)
{
//ton traitement
}
 
question 2 :
 int i=1;
char *where1, *where2;
char *result;
char * chaine = "chaine ds laquelle chercher ? et :\n"  
where1 = strchr( chaine, '?' );
where2 = strchr(chaine, ':';);
 
result = malloc((where2-where1)+1);
while (where1+i != where2)
{
result[i-1] = where1[i];
i++;
}
result[i-1]='\0';
je ne l'ai pas teste mais ca doit etre qqchose comme ca.
Le resultat devrai te donner " et " a condition que le ? se trouve toujours avant le : sinon il faut adapter un peu


Message édité par polo021 le 27-03-2003 à 08:29:04
Reply

Marsh Posté le 27-03-2003 à 11:15:57    

Merci j ai un peu fais a ma sauce et tt est bon sauf une erreur a cette ligne : result = malloc((where2-where1)+1);
le compilateur me dis : invalid conversion from `void*' to `char*'


---------------
un sabre est une arme. le kenjutsu, une technique de mort. Peu importent les bonnes intentions, c'est la seul vérité. On tue pour protéger. On tue pour que d'autres vivent. C'est ca, la vérité du sabre.
Reply

Marsh Posté le 27-03-2003 à 11:17:15    

WarmasterCS a écrit :

Merci j ai un peu fais a ma sauce et tt est bon sauf une erreur a cette ligne : result = malloc((where2-where1)+1);
le compilateur me dis : invalid conversion from `void*' to `char*'


result = (char *)malloc((where2-where1)+1);  


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-03-2003 à 11:18:07    

WarmasterCS a écrit :

Merci j ai un peu fais a ma sauce et tt est bon sauf une erreur a cette ligne : result = malloc((where2-where1)+1);
le compilateur me dis : invalid conversion from `void*' to `char*'


c juste, il faut caster car malloc renvoie un pointeur sur void dont il faut lui indiquer le type de la variable qui recoit le resultat. Ici char* =>
result = (char*)malloc((where2-where1)+1);

Reply

Marsh Posté le 27-03-2003 à 11:45:11    

pourquoi ne pas reserver (avec un malloc, par exemple) un peu de place, et en cas de besoin de plus de mémoire, faire un realloc?
 

MALLOC(3)                 Manuel du programmeur Linux                MALLOC(3)
 
NOM
       malloc,  calloc, free, realloc - Allocation et libération dynamiques de
       mémoire.
 
SYNOPSIS
       #include <stdlib.h>
 
       void *calloc (size_t nmemb, size_t size);
       void *malloc (size_t size);
       void free (void *ptr);
       void *realloc (void *ptr, size_t size);
 
DESCRIPTION
       calloc() alloue la mémoire nécessaire pour un tableau  nmemb  éléments,
       chacun  d'eux  représentant size octets, et renvoie un pointeur vers la
       mémoire allouée.  Cette zone est remplie avec des zéros.
 
       malloc() alloue size octets, et renvoie  un  pointeur  sur  la  mémoire
       allouée.  Le contenu de la zone de mémoire n'est pas initialisé.
 
       free()  libère  l'espace  mémoire pointé par ptr, qui a été obtenu lors
       d'un appel antérieur à malloc(), calloc() ou realloc().  Si le pointeur
       ptr  n'a  pas  été  obtenu  par l'un de ces appels, ou si il a déjà été
       libéré avec free(), le comportement est indéterminé.  Si ptr est  NULL,
       aucune tentative de libération n'a lieu.
 
       realloc()  modifie  la  taille  du  bloc de mémoire pointé par ptr pour
       l'amener à une taille de size octets.  realloc() conserve le contenu de
       la zone mémoire minimum entre la nouvelle et l'ancienne taille. Le con-
       tenu de la zone de mémoire nouvellement allouée n'est  pas  initialisé.
       Si  ptr  est  NULL, l'appel de realloc() est équivalent à malloc(size).
       Si size vaut zéro, l'appel est équivalent à free(ptr).   Si  ptr  n'est
       pas  NULL,  il doit avoir été obtenu par un appel antérieur à malloc(),
       calloc() ou realloc().
 
VALEUR RENVOYÉE
       Pour calloc() et malloc(), la valeur renvoyée est un  pointeur  sur  la
       mémoire  allouée, qui est correctement alignée pour n'importe quel type
       de variable, ou NULL si la demande échoue.
 
       free() ne renvoie pas de valeur.
 
       realloc() renvoie un pointeur sur la mémoire nouvellement allouée,  qui
       est  correctement  alignée pour n'importe quel type de variable, et qui
       peut être différent de ptr, ou NULL si la demande échoue,  ou  si  size
       vaut  zéro. Si realloc() échoue, le bloc mémoire original reste intact,
       il n'est ni libéré ni déplacé.
 
CONFORMITÉ
       ANSI-C
 
VOIR AUSSI
       brk(2)
 
NOTES
       Le standard Unix98 réclame que malloc(), calloc(), et  realloc()  posi-
       tionne  errno  à  ENOMEM  en cas d'échec. La Glibc suppose qu'il en est
       ainsi (et les versions  glibc  de  cette  routine  le  font).  Si  vous
       utilisez une implémentation personnelle de malloc qui ne positionne pas
       errno, certaines routines de bibliothèques peuvent échouer sans  donner
       de raison dans errno.
 
       Lorsqu'un  programme  se plante durant un appel à malloc(), calloc() ou
       realloc(), ceci est presque toujours le signe d'une corruption  du  tas
       (zone de mémoire dans laquelle sont allouées les variables dynamiques).
       Ceci survient généralement en cas  de  débordement  d'un  bloc  mémoire
       alloué, ou en libérant deux fois le même pointeur.
 
       Les  versions récentes de la bibliothèque C de Linux (libc postérieures
       à 5.4.23) et la bibliothèque GNU libc 2.x incluent  une  implémentation
       de  malloc()  dont on peut configurer le comportement à l'aide de vari-
       ables d'environnement.  Quand la  variable  MALLOC_CHECK_  existe,  les
       appels à malloc() emploient une implémentation spéciale, moins efficace
       mais plus tolérante à l'encontre des bugs simples comme le double appel
       de  free() avec le même argument, ou un débordement de buffer d'un seul
       octet (bugs de surpassement d'une unité, ou oubli  d'un  caractère  nul
       final d'une chaîne).  Il n'est toutefois pas possible de pallier toutes
       les erreurs de ce type, et l'on risque de voir des fuites de mémoire se
       produire.
 
       Si  la  variable MALLOC_CHECK_ vaut zéro, toutes les corruptions du tas
       détectées sont ignorées silencieusement; Si elle vaut 1 un  message  de
       diagnostique est affiché sur stderr. Si cette variable vaut 2, la fonc-
       tion abort() est appelée immédiatement.  Ce  comportement  est  partic-
       ulièrement  utile  car  un crash pourrait sinon se produire ultérieure-
       ment, et serait très difficile à diagnostiquer.
 
TRADUCTION
       Christophe Blaess, 1997.
 
GNU                              9 Avril 1999                        MALLOC(3)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed