Aller au contenu

C : Modification d'une chaine de caractère


Epractical

Messages recommandés

Bonjour,

J'ai un projet de cryptage à faire pour mon IUT. Je suis actuellement à la partir écriture du fichier.

Je vais vous poser une question toute bête mais ça fait 2h que je cherche.

J'ai une chaine de caractère x contenant le chemin d'accès et je souhaite ajouter la mention "_crypte" à la fin du chemin d'accès.

Exemple :

x = "C:\\test.txt";

et je veux obtenir :
y = "C:\\test_crypte.txt";

Donc rajouter la mention "_crypte" quelquesoit le nom du fichier encadrant.

Comment dois je faire ?

Merci par avance,

William

Lien vers le commentaire
Partager sur d’autres sites

char * y = new char[len(x)+len("_crypte")+1]; /* new, c est autorisé en C ?  */
strcpy(y,x);
strcpy(y+(len(y)-4), "_crypte");
strcpy(y+len(y), x+(len(x)-4)); /* pour l extension */

ou un truc comme ça.

Mais bon, ça va aller pour la suite ? parce que le chiffrement ... c'est quel algo que vous devez utiliser/faire ?

Lien vers le commentaire
Partager sur d’autres sites

Perso je ferrai ça :

- enlever l'extension (par un teste du genre à partir du point et ce qu'il y a après), ceci tu le met dans une variable.

- tu fais ta concaténation avec le "_crypte"

- encore une concaténation mais avec l'extension que tu as garder en mémoire.

Ça a l'avantage de marcher peut importe la taille de l'extension.

(désolé je connais pas trop le C, donc je peux pas te donner le code...)

Lien vers le commentaire
Partager sur d’autres sites

len() pour "length" retourne la longueur de la chaîne de caractères passée en paramètre.

char * y = new char[len(x)+len("_crypte")+1]; /* new, c est autorisé en C ?  */

Malloc non?

Sinon, j'aurais fait ça comme ça, ce qui est la même méthode que proposée par eYo (ou L ou M ou Neo25 :transpi:) :

char x[12]="C:\\test.txt";
char y[FILENAME_MAX]="";


char *PtExt = strrchr(x,'.');
strncpy(y, x, PtExt-(int)&x);
strcat(y,"_crypte");
strcat(y,PtExt);

Lien vers le commentaire
Partager sur d’autres sites

len() pour "length" retourne la longueur de la chaîne de caractères passée en paramètre.
char * y = new char[len(x)+len("_crypte")+1]; /* new, c est autorisé en C ?  */

Malloc non?

Sinon, j'aurais fait ça comme ça, ce qui est la même méthode que proposée par eYo (ou L ou M ou Neo25 :p) :

char x[12]="C:\\test.txt";
char y[FILENAME_MAX]="";


char *PtExt = strrchr(x,'.');
strncpy(y, x, PtExt-(int)&x);
strcat(y,"_crypte");
strcat(y,PtExt);

strncpy n'ajoute pas de zero terminal, le premier strcat ne marchera que par chance (que la memoire d'y soit à zéro à la base)

Allez, je propose une nouvelle version :francais:

char * y = malloc(strlen(x)+strlen("_crypte")+1);
char * PtExt = strrchr(x,'.');
strcpy(y,x);
strcpy(y+(PtExt-x),"_crypte");
strcat(y,PtExt);

Lien vers le commentaire
Partager sur d’autres sites

  char * string="quelquechose.txt";
 char * append="_chiffré";
 char * new_string=NULL;
 char * ext=strrchr (string, '.');

 new_string = (char *)malloc (sizeof (char)*(strlen (string)+strlen (append)+1));
 strncpy (new_string, string, strlen (string)-strlen (ext));
 strncat (new_string, append, strlen (append));
 strncat (new_string, ext   , strlen (ext   ));
 new_string[strlen(new_string)]='\0';

Lien vers le commentaire
Partager sur d’autres sites

La dernière ligne se sert à rien et il n'est pas plus simple que le mien :francais:

De plus, utiliser strlen() qui renvoie la longueur de la chaîne en cherchant la première occurrence du caractère NULL pour mettre le caractère NULL ne fonctionnera jamais en plus d'être inutile puisque tu initialises new_string à NULL. Et strlen c'est du c++ :p

Lien vers le commentaire
Partager sur d’autres sites

strncpy n'ajoute pas de zero terminal, le premier strcat ne marchera que par chance (que la memoire d'y soit à zéro à la base)

:fumer: strncpy n'ajoute pas de caractère NULL mais l'initialisation de y (char y[FILENAME_MAX]="";) que j'ai fait oui :yes:

Ma proposition fonctionne ;)

Ouh, merci, je pensais qu'il ne faisait que copier la chaine, donc qu'un \0. Merki :craint:

Et strlen, c'est du C++ ? pourquoi c'est à côté de strcat dans string.h ? :chinois:

Et j'en profite pour une dernière question '^^ tu cast le pointeur dans un int, pourquoi, on est sur que ça "rentre" dans un int ? il me semblait justement que sizeof(int) < sizeof(void *) sur windows 64 bits ? :|

Lien vers le commentaire
Partager sur d’autres sites

La dernière ligne se sert à rien et il n'est pas plus simple que le mien :p
Au temps pour moi, mauvais réflexe de mes années C (il y a quelques années).
De plus, utiliser strlen() qui renvoie la longueur de la chaîne en cherchant la première occurrence du caractère NULL pour mettre le caractère NULL ne fonctionnera jamais en plus d'être inutile puisque tu initialises new_string à NULL.
Tu confonds new_sting et son pointeur. new-string n'est jamais initialisé explicitement. C'est fait avec le malloc.

Sauf que c'est le même problème qu'au dessus (donc pas de "de plus").

Et strlen c'est du c++ :p
Et du C pur.

echo '#include <string.h>
#include <stdio.h>
int main (void) { char*tab="0123456789"; printf("Taille : %d\n", strlen (tab)); return 0;}' > /tmp/test.c && gcc -Wall -ansi -pedantic /tmp/test.c -o /tmp/test && /tmp/test && rm /tmp/test /tmp/test.c
Taille : 10

Lien vers le commentaire
Partager sur d’autres sites

Tu confonds new_sting et son pointeur. new-string n'est jamais initialisé explicitement. C'est fait avec le malloc.

Effectivement, j'ai cru à une notation équivalente à

="";

alors que tu initialises uniquement le pointeur :p . Cependant, malloc n'initialise pas mais réserve une zone mémoire ce qui est différent :

Allocate memory block

Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.

The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.

Lien vers le commentaire
Partager sur d’autres sites

Allocate memory block

Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.

The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.

En théorie, je sais bien.

En pratique (avec gcc+libc6) :

  char * string=NULL;
 int i;

 string=malloc (12);
 for (i=0; i<12; i++)
printf ("%d\n", (int)string[i]);

Donne

0
0
0
0
0
0
0
0
0
0
0
0

Lien vers le commentaire
Partager sur d’autres sites

Ayé je viens de me souvenir pourquoi j'avais mis ma dernière ligne. Je suis un peu rouillé en C (comme en plus je suis fatigué/pris ces derniers temps, pas eu le temps de me pencher dessus).

  char * string="quelquechose.txt";
 char * append="_chiffré";
 char * new_string=NULL;
 char * ext=strrchr (string, '.');

 new_string = (char *)malloc (sizeof (char)*(strlen (string)+strlen (append)+1));
 strncpy (new_string, string, strlen (string)-strlen (ext));
 strncat (new_string, append, strlen (append));
 strncat (new_string, ext   , strlen (ext   ));
 new_string[strlen (string)+strlen (append)]='\0';

Lien vers le commentaire
Partager sur d’autres sites

Appends the string pointed to by str2 to the end of the string pointed to by str1 up to n characters long. The terminating null character of str1 is overwritten. Copying stops once n characters are copied or the terminating null character of str2 is copied. A terminating null character is always appended to str1. If overlapping occurs, the result is undefined.

Elle ne sert à rien la dernière ligne :craint: et elle coupe new_string avant la fin. Il aurait fallu mettre "strlen(string)+srtlen(append)+1".

Copies up to n characters from the string pointed to by str2 to str1. Copying stops when n characters are copied or the terminating null character in str2 is reached. If the null character is reached, the null characters are continually copied to str1 until n characters have been copied.

Ce code ne fonctionne pas pour une autre raison, strncpy ne rajoute pas de caractère NULL à ta chaine new_string. Donc ton strncat suivant aura un comportement aléatoire.

Ça fait un petit peu de révision pour tout le monde :fumer:

Lien vers le commentaire
Partager sur d’autres sites

Appends the string pointed to by str2 to the end of the string pointed to by str1 up to n characters long. The terminating null character of str1 is overwritten. Copying stops once n characters are copied or the terminating null character of str2 is copied. A terminating null character is always appended to str1. If overlapping occurs, the result is undefined.
Ça sort d'où ce truc ? /strn?(cat)|(copy)/ ne mettent pas de \0 à la fin. strlcat et strlcpy le font par contre. Mais ce n'est disponible que sous opensbsd (et peut êre porté sous les autres *bsd)
Elle ne sert à rien la dernière ligne ;)
Elle sert à coder proprement pour le cas où on utiliserait une chaine de compilation un peu faible (comme devc++ qui a l'air de faire beaucoup moins de checks que mon environnement)
et elle coupe new_string avant la fin. Il aurait fallu mettre "strlen(string)+srtlen(append)+1".
Non, on commence à 0.
Ce code ne fonctionne pas pour une autre raison, strncpy ne rajoute pas de caractère NULL à ta chaine new_string. Donc ton strncat suivant aura un comportement aléatoire.
Seulement si ils sont compilés sous Windows apparemment.

Perso ça ne m'a jamais posé de problème sous Debian GNU/Linux (mais bon de toutse façons, si je devais faire quelque chose de multiplateforme, ça ne serait pas en C).

Lien vers le commentaire
Partager sur d’autres sites

Ça sort d'où ce truc ? /strn?(cat)|(copy)/ ne mettent pas de \0 à la fin. strlcat et strlcpy le font par contre. Mais ce n'est disponible que sous opensbsd (et peut êre porté sous les autres *bsd)

En c++ :

http://www.cplusplus.com

Appends the first num characters of source to destination, plus a terminating null-character.

En c :

The C Library Reference Guide

Appends the string pointed to by str2 to the end of the string pointed to by str1 up to n characters long. The terminating null character of str1 is overwritten. Copying stops once n characters are copied or the terminating null character of str2 is copied. A terminating null character is always appended to str1. If overlapping occurs, the result is undefined.
Elle sert à coder proprement pour le cas où on utiliserait une chaine de compilation un peu faible (comme devc++ qui a l'air de faire beaucoup moins de checks que mon environnement)
Elle ne sert à rien puisque strncat ajoute un caractère NULL. Cependant, strncpy n'en ajoute pas donc ton code ne fonctionnera pas car le strncat suivant le strncpy n'aura pas de '\0' sur lequel se repérer.
et elle coupe new_string avant la fin. Il aurait fallu mettre "strlen(string)+srtlen(append)+1".
Non, on commence à 0.
Mea culpa, erreur de ma part.
Ce code ne fonctionne pas pour une autre raison, strncpy ne rajoute pas de caractère NULL à ta chaine new_string. Donc ton strncat suivant aura un comportement aléatoire.
Seulement si ils sont compilés sous Windows apparemment.

strncpy ne rajoute pas de caratère NULL, strncat en rajoute un et ce sans importance de l'OS :

http://linux.about.com/

Thus, if there is no null byte among the first n bytes of src, the result will not be null-terminated.

http://linux.about.com/

The strcat() function appends the src string to the dest string overwriting the `\0' character at the end of dest, and then adds a terminating `\0' character.

http://linux.die.net/

The strcat() function appends the src string to the dest string overwriting the '\0' character at the end of dest, and then adds a terminating '\0' character. The strings may not overlap, and the dest string must have enough space for the result. The strncat() function is similar, except that it will use at most n characters from src. Since the result is always terminated with '\0', at most n+1 characters are written.

http://kerneltrap.org

The strcat () function appends the src string to the dest string, overwriting the null byte ('\0') at the end of dest, and then adds a terminating null byte. The strings may not overlap, and the dest string must have enough space for the result. The strncat () function is similar, except that it will use at most n characters from src; and src does not need to be null terminated if it contains n or more characters.

As with strcat (), the resulting string in dest is always null terminated.

Et si mes sources ne te conviennent pas tu en trouveras beaucoup d'autre.

Lien vers le commentaire
Partager sur d’autres sites

:craint: La zone mémoire utilisée par ton programme devait être vierge.

Malloc n'initialise pas les données :

http://www.linux-kheops.com/

Le contenu de la zone de mémoire n'est pas initialisé.

http://www.cplusplus.com

The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.

http://www.acm.uiuc.edu

The value of the space is indeterminate.

J'arrête de polluer ton topic Epractical :devil:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...