Inversion de mots

Petit problème, à résoudre en moins d'une heure (vingt minutes à une demi-heure pour les plus rapides), en langage C.

Voici votre code initial :

#include <stdio.h>

int main ()
{
char chn[81], crt, *ptr1, *ptr2;
scanf ("%80[^\n]",chn);
/* Insérez votre code ici */
printf ("%s\n",chn);
return 0;
}

L'utilisateur entrera une ligne de 80 caractères maximum, composée de caractères ASCII compris inclusivement entre 32 et 126. Ni le premier ni le dernier caractère entrés sont égaux à 32, et deux caractères avec ce code ne se suivent jamais.
On considère qu'un mot est une séquence de caractères de code différent de 0x20 se suivant dans la chaîne entrée.
Pour votre information, le caractère de code 2\^5 est l'espace en ASCII.

Votre but est d'inverser la position de tous les mots dans chn , de sorte que le premier vienne en dernier, le deuxième en avant-dernier, etc.
Exemple :
Entrée : Une chaine de test
Sortie : test de chaine Une
Vous n'avez le droit d'écrire qu'à l'emplacement du commentaire. Vous n'avez pas droit à des déclarations supplémentaires (vous avez pour seuls outils deux pointeurs et un caractère), et aucun appel supplémentaire à quelque bibliothèque que ce soit ne doit être fait. Pas de préprocesseur d'ailleurs (tant qu'à faire) ; juste les instructions de contrôle du C et des expressions à partir de constantes et de vos variables.

J'ai résolu ce problème il y a deux ans en deux heures et j'ai su retrouver la solution aujourd'hui en trois quarts d'heure.
À vous.

J'ai cru m'attendre à quelque chose de compliqué, mais en faite la principale difficulté provient de la manière dont est énoncé la consigne.

Pour peu qu'on ait un minimum de culture ça passe tout seul.

0x20 c'est 32 en hexadécimal.
2\^5 c'est 32 sous la forme d'une puissance de 2 en décimal.

En faite le défis est de s'en sortir uniquement et seulement avec les pointeurs. Je te remercie pour l'exercice, c'est un bon entraînement pour moi (je ne suis pas familier avec les pointeurs).

Je vois comment je m'en sort, et je vous préviens quand j'ai trouvé.

La difficulté n'est pas vraiment les pointeurs ; c'est plutôt le fait qu'il n'y en ait que deux qui est frustrant, non ? Ou plutôt, le fait qu'on ne puisse pas avoir de tampon, ça, c'est gênant !
Oui, c'est ça : ce qu'on préfèrerait faire, c'est écrire les mots du tableau d'origine vers un tableau de destination, dans l'autre sens. Alors que là on n'a pas le droit d'allouer un autre tableau…

Ah ouais… En fait tu profites du premier bit que je vous ai laissé… Mince, j'aurais dû définir un codage, comme ISO-8859-1 ou Latin-1, ça aurait évité ce genre de problèmes.
Sauf que ton code ne marche pas… J'obtiens une boucle infinie lors de l'exécution.

Je crois que j'ai une solution sans pointeur ni affectation.

Par contre le code doit faire genre 10\^150 octets, je le pastebin ?

Shloub : 10\^150 octets, c'est beaucoup plus grand que ton disque dur...

Sylvain : le xor swap est une astuce classique. Il y a aussi ça :
a = a + b
b = a - b
a = a - b
(mais il faut faire attention quand il y a risque d'overflow)

@LLB : J'étais pas très chaud quand je l'ai fait, c'est pour ça que j'ai été un peu long.
Cela dit je n'aurais pas pu être aussi rapide que toi.
Je ne connaissais pas cette technique de swap sans variable supplémentaire.
J'utilise la même méthode que toi, à part que j'utilise crt pour mes inversions.

@Shloub : 10\^150, c'est pas un peu le nombre de molécules dans l'univers ?
Ouaip, tu peux nous envoyer un lien.

En C, l'overflow n'a pas un comportement défini. Ça devrait marcher dans beaucoup de cas, mais tu n'as pas de garantie (en particulier, le compilateur peut changer le comportement en optimisant le code).

Tu veux dire qu'on n'a pas la garantie que l'overflow retournera à -2³² ? Eh bien dis donc, on en apprend tous les jours...!
(Voilà qui sert bien mes propos sur l'autre thread =D)

Comment ça, oups ?
Oui, pendant cinq minutes, j'avais écrit peut-être -31 au lieu de -2\^31 parce que j'avais pas réussi à faire un <sup> (comment tu as fait, toi ?).
INT_MIN = -2 147 483 648
INT_MAX = 2 147 483 647
Ça fait bien -2\^31 et 2\^31-1.

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.