Résolu concatener deux strings mais le second inversé dans l'ordre en c

  • Auteur de la discussion badrali
  • Date de début

badrali

Nouveau membre
bonjour,
mon probleme est comment concatener deux strings mais le second inversé dans l'ordre.
concatener deux strings est simple, inverser est aussi simple, mais concatener deux strings avec le second inversé dans l'ordre m'a fatigué.
exemple: str1[]="amitié", str2[]="ciao" et on doit obtenir comme resultat: amitiéoaic
aidez-moi svp


voici mon code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char str1[20], str2[20];
char *c
int len, j;
printf("premiere parole: ");
scanf("%s", &str1);
printf("et la seconde: ");
scanf("%s", &str2);
len = strlen(str2);
for(j=len; j>=0;j--)\* inverser le string*/
printf("%s", str2);
c = strcat(str1,str2)\* le probleme vient a partir de là*/
printf("%s", c);
system("PAUSE");
}
 

OmaR

Modérateur
Salut,

Si tu sais concaténer deux strings et inverser une string, je vois pas où est le problème ?
Tu inverses str2, puis tu concatènes str1 avec le résultat de l'inversion de str2.
 

badrali

Nouveau membre
voici mon code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char str1[20], str2[20];

char *c

int len, j;

[ printf("premiere parole: ");

scanf("%s", &str1);

printf("et la seconde: ");

scanf("%s", &str2); ]

[len = strlen(str2);

for(j=len; j>=0;j--)\* inverser le string*/

printf("%s", str2); ]

[ c = strcat(str1,str2)\* le probleme vient a partir de là*/

printf("%s", c); ]

system("PAUSE");
}
ainsi , c'est lisible?
 

OmaR

Modérateur
Est-ce que tu peux mettre ton code entre balises [code=c] et [/code] ? c'est plus lisible...

Et dans ton code, à aucun moment tu inverses la chaine de caractère. Tu ne fais que l'afficher inversée, c'est différent...
 

cesame

Expert
Meilleure réponse
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
// longueur des 2 chaines + itérateur
int len1, len2, i;

// buffer de lecture/traitement
// remarque : str1 taille augmenté car doit contenir la saisie initiale + str2
char str1[40], str2[20];

// ici saisie des 2 chaines
printf ("premiere parole: ");
scanf ("%s", str1);
printf ("et la seconde: ");
scanf ("%s", str2);

// calcule la longueur des 2 chaines
len1 = strlen (str1);
len2 = strlen (str2);

// traitement
for (i=len2; i > 0; i--)
{
str1[len1++] = str2[i-1];
}

// 0x00 final pour le printf suivant
str1[len1] = 0x00;

// affichage
printf ("resultat: %s\n", str1);
system ("PAUSE");
}
 

badrali

Nouveau membre
merci a tous, paticulierement à Cesame, j'ai juste modifié cette partie pour la rendre ainsi et sa donne à merveille:
{
str1[len1] = str2[i-1];
len1++;
}
sinon il prendra pa en compte le 1° caractere du string inverse c-à-d au lieu de amitiéoaic il affiche amitiéaic.
en fait , ya-til une autre possibilite à la place de 0x00?

 

cesame

Expert


Bah si "str1[len1++] = str2[i-1]" ça marche...

En C le premier caractère d'une chaîne occupe la position 0. Tu as donc:
amitié
012345
ciao
0123

Quand tu rentres dans le for(), tu as donc len1 = 6 et len2 = 4 et i = 4 et la ligne "str1[len1++] = str2[i-1]" doit se comprendre de la manière suivante : str1[6] = str2[3]

Donc le caractère en position 6 (soit le 7ème caractère) de str1 va prendre la valeur du caractère en position 3 (soir le 4ème) de str2.
Après l'affectation, on incrémente len1 (le ++ est derrière len1) et après on décrémente i.

Une autre manière de procéder sans le for() et que je trouve plus jolie est :
while (len2 > 0)
{
str1[len1++] = str2[--len2];
}
A remarquer que le -- est DEVANT len2 et non derrière...

Le 0x00 final sert à indiquer que la chaîne est finie.
C'est très utilise pour des manipulations avec des opérateurs comme sprintf, strcpy, strcat, etc... qui utilisent le caractère 0x00 pour savoir qu'ils ont fini leur traitement.

Mais tu peux très bien l'ignorer car tu disposes de la longueur de la chaîne finale dans len1.
Par exemple, pour l'afficher tu peux aussi écrire :
printf ("resultat: %.*s\n", len1, str1);
 

zeb

Modérateur
Messieurs les contrevenants,

Le règlement vous a été explicitement rappelé.
Vous devez présenter vos codes en les encadrant au début de la balise [code=C] et à la fin de la balise [/code].

Il s'agit d'une politesse due à ce qui vous lisent et à ceux qui vous aident.
Merci donc de la respecter.
 

badrali

Nouveau membre
Explique-moi autrement cette phrase:<< Vous devez présenter vos codes en les encadrant au début de la balise
C:
 et à la fin de la balise [code][/b]>> j'ai l'ai pa comprise, si necessaire donnez un exemple.
merci.
 

zeb

Modérateur
Oups, une faute de frappe rendait mon message plus compliqué que le problème !
Merci de me relire. Si ce n'est toujours pas clair, merci de lire directement le règlement.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 717 996
Membres
1 586 386
Dernier membre
aviateurdesairs
Partager cette page
Haut