Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Scandigt

47 réponses
Avatar
LMC
Bonjour,
Voici l'exercice que je tente de résoudre :
/* scandigt lit une saisie sans espaces de séparation et range les
caractères
identiques via une spécification de largeur, dans différentes variables
*/
#include <stdio.h> /* pour printf, scanf */
#include <stdlib.h>

int main(int argc, char *argv[])
{
long one, two, three, four, five;
printf("Entrez un nombre entier selon le modele \n");
printf(" abbcccddddeeeee\n");
printf("les lettres a, b, c, d, e designant\n");
printf("des chiffres identiques.\n");
scanf("%1ld %2ld %3ld %4ld %5ld\n", &one, &two, &three, &four,&five);
printf("%ld\n%ld\n%ld\n%ld\n%ld\n", one, two, three, four, five);

system("PAUSE");
return 0;

J'obtiens le résultat suivant après compilation :
Entrez un nombre entier selon le modèle
abbcccddddeeeee
les lettres a, b, c, d, e désignant
des chiffres identiques. j'appuie sur Enter et j'obtiens
122333444455555

mais je n'obtiens pas la suite qui devrait être
1
22
333
4444
55555
Merci pour toute aide.

--
@++
LMC

10 réponses

1 2 3 4 5
Avatar
candide
LMC a écrit :

Cela m'aide beaucoup, mais dans le cas présent, je ne vois rien à appliquer
à mon exercice.



C'est exactement ce que j'ai pensé quand j'ai lu l'exposé de François
lequel ne manque pas d'intérêt pour autant.

Cela me permet de découvrir certaines particularités du langage C.
Dans mon livre, il n'y a pas trace de ces noms. J'ai stdarg.h, stddef.h,
stdio.h et stdlib.h. L'auteur précise que chaque compilateur dispose
souvent, en outre, de quelques autres headers spécifiques.



En effet.


Et si je peux me permettre, laisse tomber ton bouquin de 1000 pages qui
en plus m'a l'air de proposer des exercices assez inintéressants et
attaque plutôt le C avec le tutorial du siteduZero.
Avatar
LMC
Bonjour,
"candide" a écrit dans le message de news:
48b93af8$0$1122$
LMC a écrit :

Cela m'aide beaucoup, mais dans le cas présent, je ne vois rien à
appliquer à mon exercice.



C'est exactement ce que j'ai pensé quand j'ai lu l'exposé de François
lequel ne manque pas d'intérêt pour autant.

Cela me permet de découvrir certaines particularités du langage C.
Dans mon livre, il n'y a pas trace de ces noms. J'ai stdarg.h, stddef.h,
stdio.h et stdlib.h. L'auteur précise que chaque compilateur dispose
souvent, en outre, de quelques autres headers spécifiques.



En effet.


Et si je peux me permettre, laisse tomber ton bouquin de 1000 pages qui en
plus m'a l'air de proposer des exercices assez inintéressants et attaque
plutôt le C avec le tutorial du siteduZero.



Je travaille avec les 2. Je ne serai pas plus bête. Cela m'oblige à faire
attention quand je fais les exercices.
Merci.

--
@++
LMC
Avatar
Francois
LMC a écrit :

Voilà, si j'ai dit des bêtises, je serais bien content d'avoir des
rectifications.

En espérant que ça puisse t'aider.



Cela m'aide beaucoup, mais dans le cas présent, je ne vois rien à appliquer
à mon exercice.



Ah peut-être. En fait, je voulais simplement t'éclairer sur ce que
t'expliquait Mickaël à propos de stdin, stdout et stderr et que tu
disais ne pas comprendre. Pour ton exercice, j'avoue que je n'ai pas
trop suivi. Désolé.

Mais les termes "entrée", "sortie", je suis sûr que tu les retrouveras à
un moment donné. Ça te servira.


--
François
Avatar
Thierry B.
--{ LMC a plopé ceci: }--

Ben en fait, ce qu'il faut comprendre c'est que scanf n'est pas un outil
destiné à interagir avec un humain. C'est un détournement malheureux
utilisé dans les exercice sur C.



scanf n'est pas un outil destiné à interagir avec un humain ==> je suis au
tout début de C, alors il m'est difficile de comprendre cette explication. A
quoi sert scanf alors ? D'après le livre, la fonction scanf autorise la
saisie formatée de données (depuis le clavier du terminal) et on la désigne
souvent comme le pendant de printf. Il est également précisé que la
différence fondamentale entre scanf et printf réside dans la nature des
arguments manipulés.



Ce qu'on veut dire, c'est que scanf est assez pointilleux sur ce
qu'on lui fournit à traiter par rapport à la chaine de format,
et que chaque écart, même minime, lui fait quitter le trolley :)

Ce qui n'est pas l'idéal pour un débutant. Hélas, il n'existe pas
(à mon idée) de solution simple à ce problème; à part lire et
relire et relire le man de scanf.

--
A la base, fro ne participait pas au besoin de scission d'un groupe père mais
plutôt à la transposition d'un truc du big8 canal potache sur fr.
--{ fufe virtualise Usenet }--
Avatar
Mickaël Wolff
LMC a écrit :

scanf n'est pas un outil destiné à interagir avec un humain ==> je suis au
tout début de C, alors il m'est difficile de comprendre cette explication. A
quoi sert scanf alors ?



C'est parce que ce n'est pas évident à comprendre que j'essaye de te
faire comprendre cette subtilité. Car les livres font croire que scanf
est destiné à la saisie.

fscanf sert à extraire des informations d'un flux de données entrant
en suivant un schéma. scanf est un cas particulier qui prend l'entrée
standard comme flux entrant.

D'après le livre, la fonction scanf autorise la
saisie formatée de données (depuis le clavier du terminal) et on la désigne
souvent comme le pendant de printf. Il est également précisé que la
différence fondamentale entre scanf et printf réside dans la nature des
arguments manipulés.



Oui, scanf lit un flux (stdin), printf écrit dans un flux (stdout).

Ici, je ne comprends pas , car je n'ai rien lu à ce sujet dans le livre. Je
ne connais que #include <stdio.h>.



stdin, stdout et stderr sont déclarés dans stdio.h ;)

stdio == STandarD INput OUTpout
stdin == STandarD INput
stdout == STandarD OUTput
stderr == STandarD ERRorr output


je comprends très vaguement, mais pourquoi après avoir appuyé plusieurs fois
sur Enter, la fin ne vient pas. ( Les chiffres les uns en dessous des
autres)



C'est normal, scanf n'a pas rencontré ce qu'il attendait. Ce que tu
lui as soumis correspond à : "%cn%cn%cn", or il attends "%c %c %cn".

Je ne manquerai pas car si tu devais écrire le mien !!! Serais-tu d'origine
germanique ?



Je suis Français moi monsieur, ça ne se sent pas ? ;) Mais
effectivement, mon nom est suisse-allemand.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Marc Boyer
On 2008-08-29, LMC wrote:
Bonjour,
Voici l'exercice que je tente de résoudre :
/* scandigt lit une saisie sans espaces de séparation et range les
caractères
identiques via une spécification de largeur, dans différentes variables
*/
#include <stdio.h> /* pour printf, scanf */
#include <stdlib.h>

int main(int argc, char *argv[])
{
long one, two, three, four, five;
printf("Entrez un nombre entier selon le modele n");
printf(" abbcccddddeeeeen");
printf("les lettres a, b, c, d, e designantn");
printf("des chiffres identiques.n");
scanf("%1ld %2ld %3ld %4ld %5ldn", &one, &two, &three, &four,&five);
printf("%ldn%ldn%ldn%ldn%ldn", one, two, three, four, five);

system("PAUSE");
return 0;

J'obtiens le résultat suivant après compilation :
Entrez un nombre entier selon le modèle
abbcccddddeeeee
les lettres a, b, c, d, e désignant
des chiffres identiques. j'appuie sur Enter et j'obtiens
122333444455555

mais je n'obtiens pas la suite qui devrait être
1
22
333
4444
55555



Pour faire simple (puisque d'autres ont donné des détails
compliqués), le code que vous postez est correct, mais
visiblement, votre compilateur C a un bug. Mon compilo
(et celui de Marc Espie) donnent bien
1
22
333
4444
55555

C'est quoi votre compilo ?

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
Avatar
candide
Marc Boyer a écrit :


C'est quoi votre compilo ?



Je ne pense pas qu'il sache ce qu'est un compilo ni même un compilateur
(enfin à lui de dire), ce qu'il a dit c'est qu'il est sous Devc++
autrement dit son compilateur est Mingw.

Je me rappelle quand j'étais tout débutant (avec quelques mois de C) le
mot "compilateur" m'impressionnait. Et je te raconte même pas avant
d'avoir commencé le C, je me sentais même pas le droit de prononcer ce mot.
Avatar
Thierry B.
--{ candide a plopé ceci: }--

(enfin à lui de dire), ce qu'il a dit c'est qu'il est sous Devc++
autrement dit son compilateur est Mingw.



s/Mingw/Gcc/ ?


--
disc: A synonym for "disk" that is only used in the context of CD or DVD discs
(where the disk is actually a disc).
Avatar
LMC
Comme j'ai cette habitude depuis des années de fréquentation des NG, je te
dis Bonjour,

"Thierry B." a écrit dans le message de news:

--{ LMC a plopé ceci: }--

Ben en fait, ce qu'il faut comprendre c'est que scanf n'est pas un
outil
destiné à interagir avec un humain. C'est un détournement malheureux
utilisé dans les exercice sur C.



scanf n'est pas un outil destiné à interagir avec un humain ==> je suis
au
tout début de C, alors il m'est difficile de comprendre cette
explication. A
quoi sert scanf alors ? D'après le livre, la fonction scanf autorise la
saisie formatée de données (depuis le clavier du terminal) et on la
désigne
souvent comme le pendant de printf. Il est également précisé que la
différence fondamentale entre scanf et printf réside dans la nature des
arguments manipulés.



Ce qu'on veut dire, c'est que scanf est assez pointilleux sur ce
qu'on lui fournit à traiter par rapport à la chaine de format,
et que chaque écart, même minime, lui fait quitter le trolley :)

Ce qui n'est pas l'idéal pour un débutant. Hélas, il n'existe pas
(à mon idée) de solution simple à ce problème; à part lire et
relire et relire le man de scanf.



Merci pour ces explications. Je vais tenter de les retenir, mais le cerveau
ne fonctionne plus comme du temps de ma jeunesse !

A la base, fro ne participait pas au besoin de scission d'un groupe père
mais
plutôt à la transposition d'un truc du big8 canal potache sur fr.
--{ fufe virtualise Usenet }--




--
@++
LMC
Avatar
LMC
Bonjour,

"Mickaël Wolff" a écrit dans le message de news:
48b9a7ff$0$9620$
LMC a écrit :

scanf n'est pas un outil destiné à interagir avec un humain ==> je suis
au tout début de C, alors il m'est difficile de comprendre cette
explication. A quoi sert scanf alors ?



C'est parce que ce n'est pas évident à comprendre que j'essaye de te
faire comprendre cette subtilité. Car les livres font croire que scanf est
destiné à la saisie.

fscanf sert à extraire des informations d'un flux de données entrant en
suivant un schéma. scanf est un cas particulier qui prend l'entrée
standard comme flux entrant.



Je comprends, mais que veut dire ' l'entrée standard ' ?


D'après le livre, la fonction scanf autorise la saisie formatée de
données (depuis le clavier du terminal) et on la désigne souvent comme le
pendant de printf. Il est également précisé que la différence
fondamentale entre scanf et printf réside dans la nature des arguments
manipulés.



Oui, scanf lit un flux (stdin), printf écrit dans un flux (stdout).

Ici, je ne comprends pas , car je n'ai rien lu à ce sujet dans le livre.
Je ne connais que #include <stdio.h>.



stdin, stdout et stderr sont déclarés dans stdio.h ;)

stdio == STandarD INput OUTpout
stdin == STandarD INput
stdout == STandarD OUTput
stderr == STandarD ERRorr output



Je vais l'ajouter dans mon bouquin.


je comprends très vaguement, mais pourquoi après avoir appuyé plusieurs
fois sur Enter, la fin ne vient pas. ( Les chiffres les uns en dessous
des autres)



C'est normal, scanf n'a pas rencontré ce qu'il attendait. Ce que tu lui
as soumis correspond à : "%cn%cn%cn", or il attends "%c %c %cn".



D'accord, mais alors, comment puis-je obtenir les chiffres les uns en
dessous des autres ? Le résultat doit être
122333444455555
1
22
333
4444
55555


Je ne manquerai pas car si tu devais écrire le mien !!! Serais-tu
d'origine germanique ?



Je suis Français moi monsieur, ça ne se sent pas ? ;) Mais
effectivement, mon nom est suisse-allemand.



J'ai écrit ==> d'origine, je n'ai pas écrit maintenant. ROTFL

Par contre, moi je suis Belge et fier de l'être tant que je le peux encore.
Mais avant tout, je suis Bruxellois et suis bilingue. Alors, leur querelle
de clocher, je n'en ai cure.


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org




--
@++
LMC
1 2 3 4 5