Test en C... pourrez-vous trouver la solution? :D

Statut
N'est pas ouverte pour d'autres réponses.

k o D

Elite
Et oui en relisant mon cours de C je suis tombé sur un petit test assez sympathique...
C'est un véritable piège, un tueur d'étudiants, je vous mets en garde et du coup çà sera plus simple pour vous (un homme avertit en vaut deux :p )

Code:
#include <stdio.h>

int main() {

char s[100], *p;
p=s;
s[0]='A'; s[1]='B', s[2]='C', s[3]='\0';

printf ("%s%s%c%s\n",s,p,*(p+1),p+1);
printf ("%s%s%s\n",p,p++,++p);
return 0;

}
Voilà... à vous de me dire ce que ce programme affichera.
Je donnerai la réponse correcte une fois que j'aurai eu quelques réponses de personnes =]
 

Ahava

Revenant
oula rien que voir les printf je m'enfuis :D
 

Eagor

Croqueur de pomme
Et si tu le faisais tourner? :-D
 
1er
OP
k o D

k o D

Elite
Evidemment si vous le faites tourner c'est naze ^^

Enfin ce n'est pas compliqué, je vous demande l'explication...
Mais franchement faites-le comme si vous ne pouviez pas le faire tourner et vous expliquez ensuite votre réponse :cool:
 

Vinchy

Touriste
p=&s;

S est un tableau de 100 caractères et P est un pointeur.
L'affectation ne semble pas passer au compilateur, j'arrive pas à trouver pourquoi...
Ca fait un bail que je n'ai plus fait de C, je développe en Natural depuis 4 ans au boulot

Le type du pointeur ne semble pas correct
 

Jereck

Α & Ω
Staff
Quand on déclare un tableau, le nom de ce tableau est un pointeur sur le premier élément.

Faire "s[0]" et "s*" revient au même je crois

Par sonséquent "s" étant déjà un pointeur avec "p=&s;" on obtiens un pointeur vers le pointeur du début du tableau.

'fin, je pense, les pointeurs, beek
 
L

labello

ex membre
faudrait faire l'analyse sémantique du bordel :cool:
 
1er
OP
k o D

k o D

Elite
Oups, j'ai mal recopié lol

Non il n'y a pas d'erreur, j'avais mis un & de trop :oops: :oops: :oops:

Il affichera bien qq chose. (désolé)
 

Tifox

ou pas
Moi je dis que la réponse sera aléatoire, car la chaine de caractère s n'est pas véritablement terminée, et que que seulement les 4 premiers caractères de la chaine ont été effectivement défini, les autres seront ce qu'il y a dans la mémoire a ce moment la. Et encore, je pense que ça peut dépendre aussi du compilateur.

En tout cas, je ne ferai jamais un truc aussi foireux.
 
1er
OP
k o D

k o D

Elite
En tout cas, je ne ferai jamais un truc aussi foireux.
Non moi non plus... surtout quand tu auras la solution :-D (parce que ta réponse n'est pas correcte)
 

Jereck

Α & Ω
Staff
k o D a dit:
Non moi non plus... surtout quand tu auras la solution :-D (parce que ta réponse n'est pas correcte)
Mais sans \0 dans s[], ça va bel et bien partir en jolie couille....
 
1er
OP
k o D

k o D

Elite
Jereck a dit:
Mais sans \0 dans s[], ça va bel et bien partir en jolie couille....
Merde je vais aller pieuter moi :cool:
Encore mal fait :pfiou: C'était bien \0 et pas \n :pfiou:
 

Defcon4

Touriste
Jereck a dit:
Mais sans \0 dans s[], ça va bel et bien partir en jolie couille....
+1, pour moi ça affiche des trucs en mémoire qu'il y avait avant qu'on ne réserve de cet espace pour la tableau.
 

noLain

www.wearewise.be
tout s'explique, alors ca devrait donner ceci:

ABCABCBBC
CBCBC

p pointant sur s, afficher s ou p revient au meme (-> ABCABC)
Ensuite: *(p+1) -> contenu de l'adr du début du tab + 1 -> B
Et finalement, lecture de la chaine à (adr de début du tab + 1) -> BC

Pour le deuxieme printf, le compilateur evalue les données de la derniere à la premiere:
d'abord ++p (-> donc le dernier %s = BC)
Puis p++ (-> le deuxieme %s = BC aussi)
Enfin P (-> le premiere %s = C)
Donc dans l'ordre: CBCBC
 
1er
OP
k o D

k o D

Elite
Non noLain ce n'est pas bon. :-'
 

noLain

www.wearewise.be
zut :p tout ne s'explique donc pas :beuh: :D
 
1er
OP
k o D

k o D

Elite
Je t'ai envoyé un sms avec la solution ;)
 

PinGuX

Elite
abcabcbbcabcabcc

c'est ca ?
 

cyse

Elite
donner des trucs de ce genre a un étudiant c'est quand même stupide :p quand on sait que le but en programmation c'est d'être le plus claire possible pour avoir un code propre qui sera durable et compréhensible ....
 
1er
OP
k o D

k o D

Elite
cyse a dit:
donner des trucs de ce genre a un étudiant c'est quand même stupide :p quand on sait que le but en programmation c'est d'être le plus claire possible pour avoir un code propre qui sera durable et compréhensible ....
A mais évidemment.
Ici le but de cet exercice c'est justement que l'on puisse voir que ce genre de conneries peut arriver et que dès lors il faut justement éviter cela pour ne pas devoir se casser la tête des heures sur un bug sans savoir le trouver.

Mais bon... franchement ils sont capables de nous poser çà mardi à l'exam oui...
Il est évident qu'on ne doit pas programmer de la sorte...
Malheureusement ce genre de choses peuvent se retrouver dans une boîte ou un mec a "bidouillé"... donc voilà.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut