| 1 fiddy, le 17 avr 2009 à 21:30:20Salut,
Trois erreurs dans ton code.
1/ La taille de ta chaîne est trop petite pour contenir "SC CREATE". (10 caractères minimum, tu peux en mettre plus pour être tranquille).
2/ machaine = "SC CREATE " "; Interdit de faire ça. Tu dois utiliser la fonction strncpy pour réaliser la copie de la chaîne. Par exemple :
strncpy(machaine,"SC CREATE",sizeof machaine);
machaine[sizeof machaine - 1]='\0'; //pour placer le \0 final.
3/Pas de guillemets dans la chaîne. Ou alors il faut l'échapper avec un backslash. Par exemple : "SC CREATE\" "
Cdlt
Google is your friend Répondre à fiddy | 6 KéKeCest ??, le 19 avr 2009 à 10:13:28Slt fiddy,
Je me permet cette petite correction sur la fonction strncpy() :
char *strncpy(char *cible, const char *source, size_t longueur)
> Copie au maximum longueur caractères de source dans cible en complétant par des caractères de code nul si taille cible > taille source.
Sinon dans son cas il peut simplement utiliser vieille fonction strcpy().
Bonne journée. Répondre à KéKeCest ?? | 7 fiddy, le 19 avr 2009 à 12:32:37Je ne comprends pas pourquoi tu me reprends ? Qu'est-ce qu'il ne t'a pas plu dans mon code ?
Sinon dans son cas il peut simplement utiliser vieille fonction strcpy().
Oui, mais attention au buffer overflow.
Google is your friend Répondre à fiddy | 10 KéKeCest ??, le 19 avr 2009 à 16:48:13Re,
strncpy(machaine,"SC CREATE",sizeof (machaine));
Non non comme ça, ça semble OK (:>).
Crldt. Répondre à KéKeCest ?? | 11 fiddy, le 19 avr 2009 à 16:51:05Il faut placer un '\0' en fin de chaîne. Il n'est pas mis de façon systématique.
D'où : machaine[sizeof machaine - 1]='\0'; //pour placer le \0 final.
Google is your friend Répondre à fiddy | 12 KéKeCest ??, le 19 avr 2009 à 17:02:05Stl fiddy,
Ok et si je fais ça (question) :
strncpy(machaine,"SC CREATE", (sizeof (machaine) - 1) );
> Est ce que la fonction strncpy() se débrouille elle même pour rajouter ce caractère de fin de chaine ?.
Merci de ta réponse. Répondre à KéKeCest ?? | 16 fiddy, le 19 avr 2009 à 17:25:30> Est ce que la fonction strncpy() se débrouille elle même pour rajouter ce caractère de fin de chaine ?.
Non. strncpy te garantit juste qu'elle copiera au maximum sizeof machaine - 1 bytes. Si la taille de "SC CREATE" est supérieure alors il n'y aura pas de '\0'.
Google is your friend Répondre à fiddy |
|
|
|
|
| 8 loupius, le 19 avr 2009 à 13:10:05Slt KéKeCest ?? .
Je me permets cette petite correction sur la fonction strncpy() :
char *strncpy(char *cible, const char *source, size_t longueur)
> Copie au maximum longueur caractères de source dans cible en complétant par des caractères de code nul si taille cible > taille source.
Non, la bonne réponse est:
Copie au maximum longueur caractères de source dans cible en complétant par des caractères de code nul si longueur > taille source.
Bonne journée. Répondre à loupius | 9 KéKeCest ??, le 19 avr 2009 à 16:42:34Re,
Je dirais oui "à priori" - faudrait que l'on compare nos sources comme justifications.
Crdlt. Répondre à KéKeCest ?? | 13 loupius, le 19 avr 2009 à 17:13:52Copie au maximum longueur caractères de source dans cible en complétant par des caractères de code nul si taille cible > taille source.
Il n'y a aucune possibilité pour la fonction 'strncpy' de déterminer 'taille cible', donc le remplissage ne peut se faire en fonction de cette taille; d'autre part à quoi servirait de passer 'longueur' ?
A+ Répondre à loupius | 14 KéKeCest ??, le 19 avr 2009 à 17:20:13Ok,
Bon on aura à peu prés compris qu'il copie les longueur 1er octets de source et qu'il complète si besoin ensuite avec des caractères nuls en finalisant le dernier octet par un '\n' (enfin j'espère pour ce dernier point).
crdlt. Répondre à KéKeCest ?? | 17 fiddy, le 19 avr 2009 à 17:27:01Non, le dernier point est faux. Il complète par des caractères nuls si besoin.
Mais il ne finalise pas par un '\0'.
Google is your friend Répondre à fiddy | 19 KéKeCest ??, le 19 avr 2009 à 17:32:40OK,
Donc la 2eme ligne doit être systématiquement ajoutée dans tous les cas pour obtenir une chaine en sortie saine ?.
strncpy(machaine,"SC CREATE",sizeof(machaine));
machaine[sizeof machaine - 1]='\0'; <<<----
Crldt. Répondre à KéKeCest ?? | 20 fiddy, le 19 avr 2009 à 18:05:10Oui, de façon systématique.
La règle à retenir est qu'il faut mettre un '\0' dans le tableau de destination à l'indice n-1. n étant le nombre maximale de bytes copiés.
Une autre façon intéressante de faire est l'utilisation de strncat qui met toujours un '\0' en fin de chaîne. Par contre, il ne faut pas oublier de stocker le '\0' en début de chaîne, strncat y faisant référence.
Google is your friend Répondre à fiddy |
|
|
|
|
|
|
|
|