[rz0] Merci à pepe pour le formattage en zCode de la FAQ.
Maintenant il n'y a plus personne pour vous défendre si vous ne cherchez pas ici d'abord.
Je vais essayer ici de répondre aux questions les plus fréquemment
posées que j'ai pu voir sur ces forums. Les questions sont numérotées
sous la forme (index). Il vous suffit de faire une recherche du numéro
dans la page.
(1) Quelle forme de la fonction ``main'' utiliser ?
(2) Pourquoi ne pas utiliser system("pause") ?
(3) Quelle est la manière de faire une pause de façon portable (sur
tous les systèmes) ?
(4) Comment effacer la console ?
(5) Comment afficher du texte à un endroit précis ? Comment effacer
certaines parties de la console ?
(6) Pourquoi ``scanf'' est mal ?
(7) Pourquoi ``fflush'' ne doit pas être utilisé sur ``stdin'' ?
(8) Comment enlever les restes de scanf ?
(9) Pourquoi ne pas utiliser `char' pour stocker des entiers
négatifs ? Que faut-il utiliser à la place ?
(10) Comment récupérer des entiers avec ``scanf'' ? des flottants ?
(11) Comment définir des chaînes de caractères ?
(12) Comment comparer des chaînes de caractères ?
(13) Comment obtenir un nombre au hasard ?
(14) L'instruction `goto' existe-t-elle ? Quand l'utiliser ?
(15) Comment lancer un autre programme ?
(16) Comment définir un caractère ?
(17) Comment affecter une valeur à une chaîne de caractères ?
(18) Comment récupérer un caractère avec ``scanf'' ? une chaîne ?
(19) Comment récupérer proprement une chaîne de caractères ?
(20) Comment ne pas toujours avoir les mêmes nombres aléatoires avec
``rand'' ?
(21) Comment obtenir un nombre aléatoire entre a et b ?
(1) Quelle forme de la fonction ``main'' utiliser ?
Il existe deux formes valides de partout :
int main(void); int main(int argc, char *argv[]);
Contentez-vous de celles-ci, les autres formes ont parfois la même
signification que celle-ci mais tant que vous ne comprenez pas
précisément ce que vous écrivez, ne modifiez pas ces déclarations.
La forme "void main(void)" n'est pas valide.
(2) Pourquoi ne pas utiliser system("pause") ?
La fonction ``system'' lance un autre programme à travers une ligne de
commande. ``PAUSE'' étant un programme spécifique à MS Windows, cette
ligne se trouve invalide sur la plupart des systèmes.
De plus, la plupart des systèmes disposant d'une vraie console n'ont
pas besoin et n'apprécient pas les pauses en fin de programme ; la
console étant un environnement persistant et qui ne se ferme pas comme
sous Windows.
(3) Quelle est la manière de faire une pause de façon portable (sur
tous les systèmes) ?
À la place de system("pause"), il est possible d'utiliser la fonction
``getchar'' qui s'appelle ainsi :
getchar();
Celle-ci attend l'appui de la touche Entrée. Il faut inclure
``stdio.h'' si ce n'est déjà fait.
(4) Comment effacer la console ?
En C purement standard et portable, on ne peut pas. Il faut utiliser
des commandes ou des fonctions dans des bibliothèques tierces. Évitez
ce genre d'idées pour l'heure, il n'est généralement pas besoin de ça
et l'utilisateur n'apprécie pas que l'on lui vide sa console dans la
majorité des cas.
(5) Comment afficher du texte à un endroit précis ? Comment effacer
certaines parties de la console ?
De même que la 4.
(6) Pourquoi ``scanf'' est mal ?
Lorsque ``scanf'' lit correctement les entrées, tout se passe à peu
près sans peine. Lorsque l'utilisateur n'entre pas la valeur voulue,
``scanf'' se contente d'arrêter de lire et de tout laisser en plant de
sorte que si vous réessayez d'utiliser ``scanf'' à la suite, il
tentera de relire ce qu'il n'a pas su lire et laissera à nouveau tout
en désordre. Il faut nettoyer ce que la fonction laisse derrière elle.
(7) Pourquoi ``fflush'' ne doit pas être utilisé sur ``stdin'' ?
Tout simplement parce que ce comportement n'est pas défini par le
standard, ce qui signifie que tout peut arriver. C'est donc une très
mauvaise idée car le résultat est imprévisible.
(8) Comment enlever les restes de scanf ?
Il faut utiliser une fonction de lecture telle que ``getchar'' en
boucle jusqu'à lire le caractère de retour à la ligne `\n'. Si vous
avez besoin de nettoyer c'est que vous connaissez déjà le principe des
boucles pour demander une valeur continuellement à l'utilisateur.
void
cleanscan(void) { int c; do
c = getchar(); while(c != '\n' && c != EOF); }
(9) Pourquoi ne pas utiliser `char' pour stocker des entiers
négatifs ? Que faut-il utiliser à la place ?
`char' est un type qui peut ou pas contenir des entiers négatifs selon
votre compilateur et votre système. Il vaut mieux utiliser à la place
le type `signed char' qui est assuré de pouvoir contenir des entiers
négatifs et positifs.
(10) Comment récupérer des entiers avec ``scanf'' ? des flottants ?
Il existe un format (une chaîne à donner à ``scanf'') par type de
variable que vous souhaitez récupérer. N'utiliser QUE "%ld" et "%lf"
n'apportera que des bogues à vos programmes.
Les entiers :
%hhd signed char
%hhu unsigned char
%d int
%u unsigned int
%ld long int
%lu unsigned long int
Les flottants :
%f float
%lf double
(11) Comment définir des chaînes de caractères ?
Une chaîne de caractères est un tableau de caractères. Vous n'avez pas
encore vu les tableaux ; leur manipulation risque d'être délicate.
/* 20 caractères max dont 1 pour le caractère terminal */ char s[20];
(12) Comment comparer des chaînes de caractères ?
De même, on ne peut comparer directement avec l'opérateur `=='. Il
faut utiliser ``strcmp'' qui renvoie 0 si les chaînes sont égales.
Il faut utiliser la fonction ``rand'' qui renvoie un nombre entre 0 et
``RAND_MAX''. Il faut initialiser le générateur de nombre aléatoire
avec une valeur arbitraire, le plus simple étant de prendre la date
courante.
#include <time.h>
/* ... */
int d;
srand((unsignedint) time(NULL));
d = rand();
(14) L'instruction `goto' existe-t-elle ? Quand l'utiliser ?
`goto' existe et n'est pas conseillé pour l'utilisation générale. La
règle est en principe que si l'on peut faire sans `goto' et sans
rendre le code complètement obscure, tordu, ou trop volumineux, on
fait sans.
(15) Comment lancer un autre programme ?
On doit utiliser ``system'' en lui donnant une commande comme on
l'aurait entrée dans une console.
(16) Comment définir un caractère ?
Un caractère se déclare/définit avec le type `char'.
(17) Comment affecter une valeur à une chaîne de caractères ?
À proprement parler, cela n'est pas possible ; pour faire quelque
chose de similaire, il faut copier le contenu d'une chaîne dans une
autre. C'est une copie de tableau. Il y a aussi moyen de manipuler
directement les pointeurs mais vous n'avez sûrement pas idée de
comment cela se fait et il ne vaut mieux pas essayer de faire
n'importe comment.
strcpy(dest, src);
(18) Comment récupérer un caractère avec ``scanf'' ? une chaîne ?
Ce sont les formats "%c" et "%s", respectivement. De part sa nature de
tableau, il n'y a pas besoin de placer un `&' devant le nom de la
variable. (Vous comprendrez quand vous ferez les relations pointeur à
tableau et tableau à pointeur)
À noter que cette méthode n'est pas propre du tout pour les chaînes
car si l'utilisateur entre un mot plus long que la taille de votre
chaîne... c'est la fin.
(19) Comment récupérer proprement une chaîne de caractères ?
Il existe deux méthodes selon ce que vous souhaitez récupérer. Si vous
souhaitez lire un mot, il faut utiliser ``scanf'' comme précédemment
en ajoutant devant le `s' de "%s" un nombre indiquant la taille de la
chaîne moins 1 (pour le caractère terminal).
/* 20 - 1 = 19 */
scanf("%19s", s);
Si vous souhaitez lire une ligne, vous pouvez directement utiliser
``fgets'' de la manière suivante :
/* avec la déclaration plus haut : 20 est la taille totale de la
variable, inclus le caractère terminal */
fgets(s, 20, stdin);
(20) Comment ne pas toujours avoir les mêmes nombres aléatoires avec
``rand'' ?
Voir question 13.
(21) Comment obtenir un nombre aléatoire entre a et b ?
Il existe plusieurs méthodes. La plus simple est d'utiliser
l'opérateur de reste `%'. (Réfléchissez un peu, vous devriez
comprendre comment)
La seconde est simplement de faire une boucle jusqu'à obtenir un
nombre dans l'intervalle mais peut donner des comportements longs.
ahah, même moi je trouve ca over-austère, tu crois quand même pas que tous les zeros qui font du C vont lire ce truc
Pour info il est pas prévu _pour le moment_ de régler ca, donc essaie de faire avec, ou fais en un rtf jsais pas moi, mais force pas les gens à lire ca
Je confirme, le fond est bon, la forme est pourrie.
Les gens ne liront jamais cela, même si le fond est bon, car ils n'en auront jamais le courage.
Tu as bien lu ce que tu as écrit ?
Je cite :
Citation : Pas de titre
Les questions sont numérotées sous la forme (index). Il vous suffit de faire une recherche du numéro dans la page.
Ca relève de la science-fiction, un lien vers une ancre aurait pas coûté cher
Bref, l'idée est bonne mais pas la réalisation. Il faut juste le mettre en zCode ou en HTML, même en RTF ça sera mieux
C'est dommage de passer du temps sur des FAQ si c'est pour que personne ne les lise
Puisque personne ne veut le faire, et que j'ai du temps
Citation : FAQ rz0
Je vais essayer ici de répondre aux questions les plus fréquemment
posées que j'ai pu voir sur ces forums. Les questions sont numérotées
sous la forme (index). Il vous suffit de faire une recherche du numéro
dans la page.
(1) Quelle forme de la fonction ``main'' utiliser ?
(2) Pourquoi ne pas utiliser system("pause") ?
(3) Quelle est la manière de faire une pause de façon portable (sur
tous les systèmes) ?
(4) Comment effacer la console ?
(5) Comment afficher du texte à un endroit précis ? Comment effacer
certaines parties de la console ?
(6) Pourquoi ``scanf'' est mal ?
(7) Pourquoi ``fflush'' ne doit pas être utilisé sur ``stdin'' ?
(8) Comment enlever les restes de scanf ?
(9) Pourquoi ne pas utiliser `char' pour stocker des entiers
négatifs ? Que faut-il utiliser à la place ?
(10) Comment récupérer des entiers avec ``scanf'' ? des flottants ?
(11) Comment définir des chaînes de caractères ?
(12) Comment comparer des chaînes de caractères ?
(13) Comment obtenir un nombre au hasard ?
(14) L'instruction `goto' existe-t-elle ? Quand l'utiliser ?
(15) Comment lancer un autre programme ?
(16) Comment définir un caractère ?
(17) Comment affecter une valeur à une chaîne de caractères ?
(18) Comment récupérer un caractère avec ``scanf'' ? une chaîne ?
(19) Comment récupérer proprement une chaîne de caractères ?
(20) Comment ne pas toujours avoir les mêmes nombres aléatoires avec
``rand'' ?
(21) Comment obtenir un nombre aléatoire entre a et b ?
(1) Quelle forme de la fonction ``main'' utiliser ?
Il existe deux formes valides de partout :
int main(void); int main(int argc, char *argv[]);
Contentez-vous de celles-ci, les autres formes ont parfois la même
signification que celle-ci mais tant que vous ne comprenez pas
précisément ce que vous écrivez, ne modifiez pas ces déclarations.
La forme "void main(void)" n'est pas valide.
(2) Pourquoi ne pas utiliser system("pause") ?
La fonction ``system'' lance un autre programme à travers une ligne de
commande. ``PAUSE'' étant un programme spécifique à MS Windows, cette
ligne se trouve invalide sur la plupart des systèmes.
De plus, la plupart des systèmes disposant d'une vraie console n'ont
pas besoin et n'apprécient pas les pauses en fin de programme ; la
console étant un environnement persistant et qui ne se ferme pas comme
sous Windows.
(3) Quelle est la manière de faire une pause de façon portable (sur
tous les systèmes) ?
À la place de system("pause"), il est possible d'utiliser la fonction
``getchar'' qui s'appelle ainsi :
getchar();
Celle-ci attend l'appui de la touche Entrée. Il faut inclure
``stdio.h'' si ce n'est déjà fait.
(4) Comment effacer la console ?
En C purement standard et portable, on ne peut pas. Il faut utiliser
des commandes ou des fonctions dans des bibliothèques tierces. Évitez
ce genre d'idées pour l'heure, il n'est généralement pas besoin de ça
et l'utilisateur n'apprécie pas que l'on lui vide sa console dans la
majorité des cas.
(5) Comment afficher du texte à un endroit précis ? Comment effacer
certaines parties de la console ?
De même que la 4.
(6) Pourquoi ``scanf'' est mal ?
Lorsque ``scanf'' lit correctement les entrées, tout se passe à peu
près sans peine. Lorsque l'utilisateur n'entre pas la valeur voulue,
``scanf'' se contente d'arrêter de lire et de tout laisser en plant de
sorte que si vous réessayez d'utiliser ``scanf'' à la suite, il
tentera de relire ce qu'il n'a pas su lire et laissera à nouveau tout
en désordre. Il faut nettoyer ce que la fonction laisse derrière elle.
(7) Pourquoi ``fflush'' ne doit pas être utilisé sur ``stdin'' ?
Tout simplement parce que ce comportement n'est pas défini par le
standard, ce qui signifie que tout peut arriver. C'est donc une très
mauvaise idée car le résultat est imprévisible.
(8) Comment enlever les restes de scanf ?
Il faut utiliser une fonction de lecture telle que ``getchar'' en
boucle jusqu'à lire le caractère de retour à la ligne `\n'. Si vous
avez besoin de nettoyer c'est que vous connaissez déjà le principe des
boucles pour demander une valeur continuellement à l'utilisateur.
void
cleanscan(void) { int c; do
c = getchar(); while(c != '\n' && c != EOF); }
(9) Pourquoi ne pas utiliser `char' pour stocker des entiers
négatifs ? Que faut-il utiliser à la place ?
`char' est un type qui peut ou pas contenir des entiers négatifs selon
votre compilateur et votre système. Il vaut mieux utiliser à la place
le type `signed char' qui est assuré de pouvoir contenir des entiers
négatifs et positifs.
(10) Comment récupérer des entiers avec ``scanf'' ? des flottants ?
Il existe un format (une chaîne à donner à ``scanf'') par type de
variable que vous souhaitez récupérer. N'utiliser QUE "%ld" et "%lf"
n'apportera que des bogues à vos programmes.
Les entiers :
%hhd signed char
%hhu unsigned char
%d int
%u unsigned int
%ld long int
%lu unsigned long int
Les flottants :
%f float
%lf double
(11) Comment définir des chaînes de caractères ?
Une chaîne de caractères est un tableau de caractères. Vous n'avez pas
encore vu les tableaux ; leur manipulation risque d'être délicate.
/* 20 caractères max dont 1 pour le caractère terminal */ char s[20];
(12) Comment comparer des chaînes de caractères ?
De même, on ne peut comparer directement avec l'opérateur `=='. Il
faut utiliser ``strcmp'' qui renvoie 0 si les chaînes sont égales.
Il faut utiliser la fonction ``rand'' qui renvoie un nombre entre 0 et
``RAND_MAX''. Il faut initialiser le générateur de nombre aléatoire
avec une valeur arbitraire, le plus simple étant de prendre la date
courante.
#include <time.h>
/* ... */
int d;
srand((unsignedint) time(NULL));
d = rand();
(14) L'instruction `goto' existe-t-elle ? Quand l'utiliser ?
`goto' existe et n'est pas conseillé pour l'utilisation générale. La
règle est en principe que si l'on peut faire sans `goto' et sans
rendre le code complètement obscure, tordu, ou trop volumineux, on
fait sans.
(15) Comment lancer un autre programme ?
On doit utiliser ``system'' en lui donnant une commande comme on
l'aurait entrée dans une console.
(16) Comment définir un caractère ?
Un caractère se déclare/définit avec le type `char'.
(17) Comment affecter une valeur à une chaîne de caractères ?
À proprement parler, cela n'est pas possible ; pour faire quelque
chose de similaire, il faut copier le contenu d'une chaîne dans une
autre. C'est une copie de tableau. Il y a aussi moyen de manipuler
directement les pointeurs mais vous n'avez sûrement pas idée de
comment cela se fait et il ne vaut mieux pas essayer de faire
n'importe comment.
strcpy(dest, src);
(18) Comment récupérer un caractère avec ``scanf'' ? une chaîne ?
Ce sont les formats "%c" et "%s", respectivement. De part sa nature de
tableau, il n'y a pas besoin de placer un `&' devant le nom de la
variable. (Vous comprendrez quand vous ferez les relations pointeur à
tableau et tableau à pointeur)
À noter que cette méthode n'est pas propre du tout pour les chaînes
car si l'utilisateur entre un mot plus long que la taille de votre
chaîne... c'est la fin.
(19) Comment récupérer proprement une chaîne de caractères ?
Il existe deux méthodes selon ce que vous souhaitez récupérer. Si vous
souhaitez lire un mot, il faut utiliser ``scanf'' comme précédemment
en ajoutant devant le `s' de "%s" un nombre indiquant la taille de la
chaîne moins 1 (pour le caractère terminal).
/
* 20 - 1 = 19 */
scanf("%19s", s);
Si vous souhaitez lire une ligne, vous pouvez directement utiliser
``fgets'' de la manière suivante :
/* avec la déclaration plus haut : 20 est la taille totale de la
variable, inclus le caractère terminal */
fgets(s, 20, stdin);
(20) Comment ne pas toujours avoir les mêmes nombres aléatoires avec
``rand'' ?
Voir question 13.
(21) Comment obtenir un nombre aléatoire entre a et b ?
Il existe plusieurs méthodes. La plus simple est d'utiliser
l'opérateur de reste `%'. (Réfléchissez un peu, vous devriez
comprendre comment)
La seconde est simplement de faire une boucle jusqu'à obtenir un
nombre dans l'intervalle mais peut donner des comportements longs.
Voilà .
EDIT : J'aurais bien mis des ancres, mais j'ai pas trouvé comment on créer .
[EDIT] Suite à un MP de rz0, je fais la FAQ en plusieurs posts
Je vais essayer ici de répondre aux questions les plus fréquemment
posées que j'ai pu voir sur ces forums. Les questions sont numérotées
sous la forme (index). Il vous suffit de faire une recherche du numéro
dans la page.
(1) Quelle forme de la fonction ``main'' utiliser ?
(2) Pourquoi ne pas utiliser system("pause") ?
(3) Quelle est la manière de faire une pause de façon portable (sur
tous les systèmes) ?
(4) Comment effacer la console ?
(5) Comment afficher du texte à un endroit précis ? Comment effacer
certaines parties de la console ?
(6) Pourquoi ``scanf'' est mal ?
(7) Pourquoi ``fflush'' ne doit pas être utilisé sur ``stdin'' ?
(8) Comment enlever les restes de scanf ?
(9) Pourquoi ne pas utiliser `char' pour stocker des entiers
négatifs ? Que faut-il utiliser à la place ?
(10) Comment récupérer des entiers avec ``scanf'' ? des flottants ?
(11) Comment définir des chaînes de caractères ?
(12) Comment comparer des chaînes de caractères ?
(13) Comment obtenir un nombre au hasard ?
(14) L'instruction `goto' existe-t-elle ? Quand l'utiliser ?
(15) Comment lancer un autre programme ?
(16) Comment définir un caractère ?
(17) Comment affecter une valeur à une chaîne de caractères ?
(18) Comment récupérer un caractère avec ``scanf'' ? une chaîne ?
(19) Comment récupérer proprement une chaîne de caractères ?
(20) Comment ne pas toujours avoir les mêmes nombres aléatoires avec
``rand'' ?
(21) Comment obtenir un nombre aléatoire entre a et b ?
(1) Quelle forme de la fonction ``main'' utiliser ?
Il existe deux formes valides de partout :
int main(void); int main(int argc, char *argv[]);
Contentez-vous de celles-ci, les autres formes ont parfois la même
signification que celle-ci mais tant que vous ne comprenez pas
précisément ce que vous écrivez, ne modifiez pas ces déclarations.
Il a pas besoin de faire un nouveau sujet. Il fait tous les posts un à un dans ce sujet, et rz0 aura plus qu'a changer son 1er sujet par une liste de liens.
Tant qu'a faire, si tu fais ces posts, pense à mettre un lien vers le 1er post du sujet en bas de chaque post, pour qu'on puisse naviguer facilement...
C'est pas fait pour être lu d'un seul bloc mais on peut au moins lire les questions en haut ; c'est 20 lignes et après suffit de regarder celle qui nous intéresse. De toute façon, si ça vous plait tant d'être encore, soyez-le ; j'ai écrit la FAQ pour ceux qui se donnerait la peine d'essayer de sortir de l'abrutissement, c'est tout.
Maintenant celui qui pose une question qui a sa réponse là dedans jle mache ; vous n'allez pas me dire que ce n'est pas bien ordonné hein...
Secret (cliquez pour afficher)
Evidemment que je n'ai pas le droit mais si franchement vous croyez que tout le monde sera toujours aussi sympa de vous apporter tout prêt des réponses à vos questions stupides que vous ne daignez même pas regarder, vous n'avez certainement rien compris au monde de la programmation...
J'adore ce site, mais je trouve la FAQ pas très claire .
Sans vouloir faire de la pub , cette faq pour le c++ et cette faq pour le C sont plus complète , mais j'espère que vos ameliorations futur permettront de faire une meilleure faq que celle que je vous propose.
J'ai quelques questions, moin courantes, mais utile
Comment rediriger la sortie de printf? Comment capter les resultats de programmer executer?
Comment stoper l'execution du programme, a tout moment?
(Reponse : exit(1); // Quite et renvoi 1, ce qui signifie une ereur. Si on est dans main, on peut aussi utiliser return 1;)
Q: Comment rediriger la sortie de printf?
A: utilise les autres fonctions *printf pour ca. sprintf renvoie une chaine au lieu d'afficher, et je pense que fprintf(buf, "%d", truc) écris dans le buffer buf.
Q : Comment capter les resultats de programmer executer?
Q : ca veut dire quoi ?
Q : Comment stoper l'execution du programme, a tout moment?
Effectivement exit() est une solution, et tu peux mettre tout sauf 0 (pas forcément 1), sachant que certains ont probablement une signification précise.
Q: Comment rediriger la sortie de printf?
A: utilise les autres fonctions *printf pour ca. sprintf renvoie une chaine au lieu d'afficher, et je pense que fprintf(buf, "%d", truc) écris dans le buffer buf.
fprintf écrit dans le pointeur de fichier donné en premier paramaètre. Exemple
C'est une question pour mettre des points a chaque joueurs au mode plusieurs joueur dans le jeu plus ou moins
Mais est-ce que l'on m'écoute Rooh on pense jamais a moi
Mais une variable, est obligatoirement variable!!!
int mavar;
//mavar peut valoir n'importe quel nombre!!!
scanf("%d",mavar);//Qui sais si elle vaut -50, 745, ou autre chose?!
FAQ C --- les réponses à _vos_ questions fréquentes
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
If you'd like to join us, read "How do we work at OpenClassrooms"! :)
If you'd like to join us, read "How do we work at OpenClassrooms"! :)