xxdids
Messages postés2Date d'inscriptionmardi 28 février 2012StatutMembreDernière intervention12 novembre 2012 12 nov. 2012 à 00:21
Bonjour, et merci pour ton code il m'est d'un parfait secourt.
Mais je me demande comment je peux gérer les PS1 et PS2 décrit dans le SCL (Shell Command Language).
Si j'ai bien compris, PS1 c'est juste ' $ ' et PS2 c'est au cas ou le shell a besoin de plus d'infos donc il donne à nouveau la mais à l'utilisateur et dans ce cas de figure le ' $ ' devient ' > '.....
Comment je fais ça avec ton code??? Stp.
Merci d'avance...
huntermaster
Messages postés1Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention17 août 2011 17 août 2011 à 19:25
slt,
cette fonction est parfaitement ce que je recherchai pour ce que j'essaye de faire et je t'en remercie de l'avoir posté, mais il y a une petite partie que je n'arrive pas a comprendre...
char const *rep = aux + strlen(aux);
while (rep >= aux && *rep != '/')
{
rep--;
}
comment une chaine peut etre additionné à un entier? et du coup je ne comprend pas ce que "rep" renvoie et ce que fait la boucle while...
Merci
lalla0623
Messages postés1Date d'inscriptiondimanche 19 avril 2009StatutMembreDernière intervention 2 novembre 2010 2 nov. 2010 à 00:06
slt,
apparement l'utilisateur ne peut changer le prompte normalement si tu veux decrire le comportement d'un shell : tu peux faire export ps1 = " "
ensuite tu veras que le prompt a changer et parail pour le ps2
ensuite pour la gestion des variables speciales de shell.
je suis entraine de faire la meme choses mais c vrai que pour juste afficher juste un prompt c pas mal
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 12 déc. 2005 à 19:27
et déclare tes variables en début de scope!!! pas n'importe ou avec tes {} !
~(.:: NitRic ::.)~
PiloteLeblanc
Messages postés1Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention12 décembre 2005 12 déc. 2005 à 18:56
strlen() ne calcul pas le caractère NULL de fin de "string", et puisque tu ajoutes exactement 6 caractères, il faudrait ajouter +1 dans le total des caractères pour ce malloc().
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 12 déc. 2005 à 10:59
« MAIS, pour les mêmes raisons qu'avec snprintf, il vaut mieux utiliser strncpy/strncat »
- la principale raison est le débordement ...
strncpy()/strncat() ne sont pas a utiliser pour éviter les débordements, elles copies X caractère(s) sans ce préoccuper de la taille des chaines
char buffer[8] = {0};
strncat_safe(buffer, 8, "abcdefghijklmnopqrstuvwxyz", 512);
puts(buffer); /* va afficher dans la console: abcdefg */
ce genre de fonction par contre peut éviter les débordements ...
---------------------------
char buffer[8] = {0};
strncat(buffer, "abcdefghijklmnopqrstuvwxyz", 512);
puts(buffer); /* j'crois qu'il va y avoir un p'tit problème au dessus ... */
pas ce genre de fonction ...
---------------------------
~(.:: NitRic ::.)~
mickbad
Messages postés71Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention20 avril 2008 12 déc. 2005 à 08:26
salut,
Tout à fait d'accord d'essayer de ne pas utiliser strcpy/strcat car d'une part (comme NitRic la précisé) c'est long et d'autre part, ce n'est pas très élégant ;)
Par contre au sujet de s[n]printf, mieux vaut utiliser snprintf plutôt que sprintf car tu gères la taille à écrire => sinon attention au débordement de tampon pouvant rendre instable/vulnérable le programme.
Utilisation :
char* s = (char*)malloc(256 * sizeof(char));
if (s != NULL) // au cas où ya plus de mémoire :)
snprintf(s, 256, "ma réponse n°%d: %s", [tonID], [tonStr]);
Ainsi tu es sûr que ton pointeur s contiendra au maximum 256 éléments ! (évitant des débordements, des fuites de mémoires potentielles, ...)
Ceci dit, il ne faut pas réellement bouder les fonction strcpy/strcat surtout s'il s'agit de les utiliser de temps en temps. MAIS, pour les mêmes raisons qu'avec snprintf, il vaut mieux utiliser strncpy/strncat
voilà...
Mick
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 11 déc. 2005 à 07:08
si tu compile en C++ ton « char *invite... » est okay mais si c'est du C
il te faut le déclarer en début de fonction(début du scope de la fonction) !
vérifie ton malloc()
----
[...]
char * invite = (char *)malloc( [...] );
if (invite == NULL)
return NULL;
[...]
----
je te conseil d'utiliser sprintf()( et même _snprintf() ) au lieux des 10000 strcat() ...
strcat() part _toujours_ du début de la chaine jusqu'a la fin pour _ensuite_ ajouter
a la suite ... c'est très long surtout pour _un_ caractère ...
ou encore te créer un strcpy() maison pour toutes ces copies(strcpy()/strcat()) ...
12 nov. 2012 à 00:21
Mais je me demande comment je peux gérer les PS1 et PS2 décrit dans le SCL (Shell Command Language).
Si j'ai bien compris, PS1 c'est juste ' $ ' et PS2 c'est au cas ou le shell a besoin de plus d'infos donc il donne à nouveau la mais à l'utilisateur et dans ce cas de figure le ' $ ' devient ' > '.....
Comment je fais ça avec ton code??? Stp.
Merci d'avance...
17 août 2011 à 19:25
cette fonction est parfaitement ce que je recherchai pour ce que j'essaye de faire et je t'en remercie de l'avoir posté, mais il y a une petite partie que je n'arrive pas a comprendre...
char const *rep = aux + strlen(aux);
while (rep >= aux && *rep != '/')
{
rep--;
}
comment une chaine peut etre additionné à un entier? et du coup je ne comprend pas ce que "rep" renvoie et ce que fait la boucle while...
Merci
2 nov. 2010 à 00:06
apparement l'utilisateur ne peut changer le prompte normalement si tu veux decrire le comportement d'un shell : tu peux faire export ps1 = " "
ensuite tu veras que le prompt a changer et parail pour le ps2
ensuite pour la gestion des variables speciales de shell.
je suis entraine de faire la meme choses mais c vrai que pour juste afficher juste un prompt c pas mal
12 déc. 2005 à 19:27
~(.:: NitRic ::.)~
12 déc. 2005 à 18:56
invite = malloc(strlen(user) + strlen(host) + strlen(rep) + 6);
strlen() ne calcul pas le caractère NULL de fin de "string", et puisque tu ajoutes exactement 6 caractères, il faudrait ajouter +1 dans le total des caractères pour ce malloc().
12 déc. 2005 à 10:59
- la principale raison est le débordement ...
strncpy()/strncat() ne sont pas a utiliser pour éviter les débordements, elles copies X caractère(s) sans ce préoccuper de la taille des chaines
char * strncpy(char * dst, const char * src, size_t cnt)
{
char * start = dst;
while (cnt-- && *src) {
*dst++ = *src++;
}
/* implémentation spécifique */
if (cnt != 0) {
while (--cnt) {
*dst++ = 0;
}
}
return start;
}
et un strncat() ressemble grossièrement a ceci:
char * strncat(char * dst, const char * src, size_t cnt)
{
char * start = dst;
while (*dst) {
*dst++;
}
strncpy(dst, src, cnt);
return start;
}
y'a aucune vérification au niveau de l'espace maximale des chaines(dst en l'occurence) ...
char * strncat_safe(char * dst, size_t dst_size, const char * src, size_t cnt)
{
char * start = dst;
if (dst_size == 0)
return start;
while (dst_size && *dst) {
dst++;
dst_size--;
}
while (dst_size && cnt && *src) {
*dst++ = *src++;
cnt--;
dst_size--;
}
if (dst_size == 0) {
dst--;
}
*dst = 0;
return start;
}
char buffer[8] = {0};
strncat_safe(buffer, 8, "abcdefghijklmnopqrstuvwxyz", 512);
puts(buffer); /* va afficher dans la console: abcdefg */
ce genre de fonction par contre peut éviter les débordements ...
---------------------------
char buffer[8] = {0};
strncat(buffer, "abcdefghijklmnopqrstuvwxyz", 512);
puts(buffer); /* j'crois qu'il va y avoir un p'tit problème au dessus ... */
pas ce genre de fonction ...
---------------------------
~(.:: NitRic ::.)~
12 déc. 2005 à 08:26
Tout à fait d'accord d'essayer de ne pas utiliser strcpy/strcat car d'une part (comme NitRic la précisé) c'est long et d'autre part, ce n'est pas très élégant ;)
Par contre au sujet de s[n]printf, mieux vaut utiliser snprintf plutôt que sprintf car tu gères la taille à écrire => sinon attention au débordement de tampon pouvant rendre instable/vulnérable le programme.
Utilisation :
char* s = (char*)malloc(256 * sizeof(char));
if (s != NULL) // au cas où ya plus de mémoire :)
snprintf(s, 256, "ma réponse n°%d: %s", [tonID], [tonStr]);
Ainsi tu es sûr que ton pointeur s contiendra au maximum 256 éléments ! (évitant des débordements, des fuites de mémoires potentielles, ...)
Ceci dit, il ne faut pas réellement bouder les fonction strcpy/strcat surtout s'il s'agit de les utiliser de temps en temps. MAIS, pour les mêmes raisons qu'avec snprintf, il vaut mieux utiliser strncpy/strncat
voilà...
Mick
11 déc. 2005 à 07:08
#include "stdlib.h"
#include "stdio.h"
...
il te faut des <> pas des ""
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
si tu compile en C++ ton « char *invite... » est okay mais si c'est du C
il te faut le déclarer en début de fonction(début du scope de la fonction) !
vérifie ton malloc()
----
[...]
char * invite = (char *)malloc( [...] );
if (invite == NULL)
return NULL;
[...]
----
je te conseil d'utiliser sprintf()( et même _snprintf() ) au lieux des 10000 strcat() ...
strcat() part _toujours_ du début de la chaine jusqu'a la fin pour _ensuite_ ajouter
a la suite ... c'est très long surtout pour _un_ caractère ...
ou encore te créer un strcpy() maison pour toutes ces copies(strcpy()/strcat()) ...
~(.:: NitRic ::.)~