Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C > FAQ C > Lecture du sujet

FAQ C

nouvelle version

Vous devez être inscrit pour pouvoir poster des messages

Page : Précédente  1  2  3  Suivante
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : Précédente  1  2  3  Suivante
Hors ligne GuilOooo # Posté le 22/04/2007 à 17:54:15
PriPrOTtTt§!!!§
Avatar
Groupe : Membres
Reprise du dernier message de la page précédente :
[2][9] Quand je fais un scanf pour récupérer un nombre, si l'utilisateur tape une lettre, j'ai pleins de problèmes. Que faire ?

Lire ce tutoriel pour apprendre à vous passer de scanf et utiliser quelque chose de plus solide : Les tutoriaux > Non-Officiels > Programmation > C/C++ > [C] Réaliser des saisies sécurisées grâce à fgets.

PS : M@teo21 a lui même écrit quelque chose à ce sujet, c'est une annexe du cours de C. Lire l'annexe du cours de C sur les entrées sécurisées.
Édité le 07/05/2008 à 21:06:56 par GuilOooo
Hors ligne zulon # Posté le 23/04/2007 à 10:43:44
The shrieker shrieks.
Avatar
Groupe : Membres
[7][5] Quelle est la différence entre une bibliothèque et une librairie ?
En informatique, une Bibliothèque logicielle est un ensemble de fonctions regroupées pour réaliser un groupe de tâches du même domaine.

Une librairie est un local avec une porte, des fenêtres et des livres à vendre sur des étagères.

Ne confondez pas les deux!

Library, en anglais, est un "faux-ami", qui veux dire bibliothèque. L'erreur vient de là.

Citation : M@teo21 - Le tuto
A noter : le mot anglais est "library" et il se traduit par "bibliothèque". "Librairie" est donc un faux-ami.
En théorie, on devrait donc dire bibliothèque et non librairie. Mais pour ma part, j'ai pris l'habitude d'écrire librairie (et je ne suis pas le seul ;) ) donc je continuerai à utiliser ce terme. Retenez quand même que la traduction exacte est plutôt "bibliothèque".
Édité le 25/04/2007 à 12:41:31 par zulon

Image utilisateur
 
Hors ligne Kevin Leonhart # Posté le 28/04/2007 à 18:48:19
Avatar
Groupe : Membres
[7][6] Comment récupérer la date et/ou l'heure ?

Toutes les fonctions utilisées dans cette question sont présentes dans l'en-tête <time.h>.

La première étape est de récupérer le timestamp.
Pour cela rien de bien dur :

Code : C
time_t temps = time(NULL);

On peut d'ailleurs vérifier qu'on a la bonne valeur en l'affichant :

Code : C
printf("%ld\n", temps);

Maintenant il nous faut se servir d'une fonction qui va déduire la date et l'heure à partir du timestamp.
Cette fonction c'est ``ctime". Elle prend l'adresse de la variable contenant le timestamp en paramètre et en ressort une chaîne de caractères contenant toutes les informations.

Code : C
time_t temps = time(NULL);
printf("%s", ctime(&temps));

Donnera par exemple :
Code : Console
Sat Apr 28 15:19:06 2007


On peut aussi contrôler plus finement les informations qu'on veut afficher.
Pour cela, il faut passer par une "conversion" du timestamp en une structure de type `tm'.
La fonction ``localtime" s'en occupe très bien en nous renvoyant l'horaire locale, contrairement à ``gmtime" qui renvoie l'horaire UTC.

Code : C
/* on récupère le timestamp */
time_t timestamp = time(NULL);
/* on le convertit dans une instance de la structure tm */
struct tm *temps = localtime(&timestamp);

Comme vous pouvez le voir sur la page de documentation de la structure `tm', celle ci contient toutes les informations que nous voulons.
Nous pouvons donc afficher l'heure par exemple en faisant simplement :

Code : C
printf("%d\n", temps->tm_hour);

Ce qui chez moi donne :
Code : Console
16

Méfiez vous tout de même, ça parait évident mais le programme vous affichera l'heure de votre système d'exploitation. Ainsi sur mon système qui a 2 heures de retard (allez savoir pourquoi Image utilisateur), le programme m'affiche 16 sans vergogne alors qu'il est 18 heures en réalité...

A partir de votre instance de tm, vous pouvez aussi afficher tout d'un coup, grâce à ``asctime"

Code : C
time_t timestamp = time(NULL);
struct tm *temps = localtime(&timestamp);
printf("%s", asctime(temps));

Donnera :
Code : Console
Sat Apr 28 15:19:06 2007


Ou vous pouvez enfin formater seulement les informations qui vous intéressent dans une chaîne de caractères grâce à ``strftime".

Code : C
/* on récupère le timestamp */
time_t timestamp = time(NULL);
/* on crée une chaîne suffisamment longue */
char chaineSortie[20];
/* on convertit le timestamp dans une instance de la structure tm */
struct tm *temps = localtime(&timestamp);
/* on récupère les infos qu'on veut dans la chaîne */
strftime (chaineSortie, 20, "Il est %H:%M:%S", temps);
/* on affiche le tout */
printf ( "%s", chaineSortie);

Donnera par exemple :
Code : Console
Il est 16:48:24


Comme vous le voyez, ce sont les formateurs %H, %M, ... qui indiquent ce qui atterrira dans votre chaîne.
Pour la liste complète, reportez vous sur la page de documentation.
La seule chose dont il faut se méfier c'est de créer une chaîne suffisamment longue. ;)
Édité le 04/05/2007 à 19:30:14 par Kevin Leonhart
Hors ligne gouttegd # Posté le 30/04/2007 à 00:50:18
Avatar
Groupe : Membres
Cette question ne concerne pas vraiment la programmation en C, mais beaucoup de Zér0s sous Windows se la posent, alors...

[2][10] Comment afficher des caractères accentués sous Windows ?
Par défaut, la console de Windows utilise un encodage hérité du temps de MS-DOS (l'encodage IBM 850), qui ne permet pas d'afficher les caractères accentués ou les caractères spéciaux comme ©, ®, «, », etc.

Toutefois, l'encodage utilisé par la console de Windows est modifiable à volonté, par la commande chcp (CHange CodePage) intégrée à l'interpréteur de commandes. Ainsi, entrer cette commande
Code : Console - Afficher / masquer les numéros de ligne
chcp 1252

indiquera à votre console d'utiliser la "page de code 1252", qui est un encodage très proche du Latin-1, idéal pour la langue française.

Il n'est alors nul besoin de modifier vos programmes (ni même de les recompiler), les accents et autres caractères spéciaux s'afficheront sans problèmes.

Une autre possibilité consiste à changer l'encodage directement depuis le code de votre programme, en utilisant la fonction appropriée de l'API Windows, SetConsoleOutputCP(). Dans ce cas, une bonne pratique consiste à récupérer l'encodage utilisé au démarrage du programme afin de pouvoir le restaurer à la sortie.
Code : C - Afficher / masquer les numéros de ligne
  1. #include <windows.h> /* pour les fonctions GetConsoleOutputCP et associées */
  2.  
  3. /* Au début du programme, on récupère l'encodage
  4.  * utilisé par la console. */
  5. UINT default_codepage = GetConsoleOutputCP();
  6.  
  7. /* Puis, on change cet encodage pour imposer celui
  8.  * que l'on veut (ici, page de code 1252). */
  9. SetConsoleOutputCP(1252);
  10.  
  11. /* Le corps du programme. */
  12.  
  13. /* A la fin du programme, on restaure l'encodage initial. */
  14. SetConsoleOutputCP(default_codepage);


Quelle que soit la méthode retenue, si vous utilisez la console Windows "standard", il faut encore changer la police utilisée par celle-ci pour la remplacer par une police capable d'afficher des caractères accentués : clic-droit sur la barre de titre de la console, "Propriétés", dans l'onglet "Police", choisissez la police "Lucida Console". En fermant la fenêtre, sélectionnez "Enregistrer les propriétés pour les futures fenêtres portant le même titre". Notez que ce n'est pas nécessaire si vous utiliser le nouvel interpréteur de commandes de Microsoft, PowerShell.

Autre possibilité, ne nécessitant aucune configuration de la console cible (au niveau de la fonte comme de l'encodage), l'utilisation des fonctions CharToOem ou CharToOemBuffer de l'API Windows :
Code : C - Afficher / masquer les numéros de ligne
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main(void)
  6. {
  7.     char texte[20] = "";
  8.     CharToOemBuff("éééààà!", texte, sizeof texte - 1);
  9.     puts(texte);
  10.     return 0;
  11. }

(Merci à tc pour avoir suggéré cette solution. :) )
Édité le 04/12/2007 à 13:25:10 par gouttegd

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

http://fr.hypo-theses.com/
 
Hors ligne scriptoff # Posté le 01/05/2007 à 20:52:21
While I breath , I hope
Avatar
Groupe : Membres
[7][7]Comment Configurer son compilateur

Le mieux est d'aller sur le site d' Emmanuel Delahaye ou tout y est bien expliqué : ici
Édité le 18/05/2007 à 14:52:51 par scriptoff
Hors ligne Yno # Posté le 04/05/2007 à 12:06:02
SCE
Avatar
Groupe : Membres
[4][7] Comment transformer ma chaîne de caractères en une valeur (int, float) ?

Si vous possédez une chaîne de caractères tel que :
Code : C
char number[] = "12";

Il vous est possible d'extraire le nombre que représente cette chaîne afin d'obtenir une variable de type long valant 12.

Pour cela, vous pouvez utiliser la fonction strtol() :
Code : C
#include <stdlib.h>

char number[] = "12";
long var = strtol(number, NULL, 0);

/* ici, var = 12 */

Il est aussi possible de convertir des nombres flottants.
Pour cela, utilisez strtod() :
Code : C
#include <stdlib.h>

char number[] = "12.5";
double var = strtod(number, NULL);

/* ici, var = 12.5 */


Un exemple d'utilisation pratique est disponible ici :
http://www.siteduzero.com/tuto-3-11181-1-c-realiser-des-saisies-securisees-grace-a-fgets.html

Pour convertir une chaîne formatée, vous pouvez utiliser sscanf() :
Code : C
#include <stdio.h>
#include <stdlib.h>

int var1, var2;
char number[] = "12 25";

sscanf(number, "%d %d", &var1, &var2);

/* ici, var1 = 12 et var2 = 25 */

La fonction sscanf renvoie un entier représentant le nombre de conversions réussis, il peut être bon de tester cette valeur afin de savoir si elle correspond aux nombres de conversions que l'on a demandé (2 dans notre cas), si elle est inférieur, il y a une erreur de format.

Pour plus de précisions sur l'utilisation des fonctions strto* et *scanf, reportez-vous aux pages de man :


Avec l'aimable participation de :
- asmanur
- scriptoff
- Zulon
Édité le 12/05/2007 à 17:46:28 par Yno
Hors ligne Yno # Posté le 05/05/2007 à 12:07:59
SCE
Avatar
Groupe : Membres
[8][2] Que signifie le signe # dans une macro ?

Cela demande au préprocesseur d'encadrer la variable qui suivra # par des guillemets.

Voici un exemple :
Code : C
#define PRINTINT(var) printf("%s = %d\n", #var, var)

int ma_variable = 2;
int mon_autre_variable = 0;

PRINTINT(ma_variable);
PRINTINT(mon_autre_variable);

Code : Console
ma_variable = 2
mon_autre_variable = 0

Au premier appel de la macro PRINTINT par exemple, le préprocesseur remplacera cet appel par cette ligne de code :
Code : C
printf("%s = %d\n", "ma_variable", ma_variable)

Édité le 12/05/2007 à 17:46:12 par Yno
Hors ligne 230 # Posté le 10/05/2007 à 00:13:23
Porque te vas.
Avatar
Groupe : Membres
[2][11]Comment peut-on lire une chaîne de caractères contenant des blancs (espaces, tabulations, etc.)?

D'abbord, je tiens à préciser que scanf est mal ! (voir FAQ [2] [5]).


La commande associée a scanf pour pouvoir lire des chaînes de caractères comportant des blancs est :
Code : C
scanf("%[^\n]", ch);
getchar();


Lien informatif :
scanf démythifiée
Entrée solide en C

Édité le 11/05/2007 à 20:23:50 par

Image utilisateur

 
Hors ligne smilz # Posté le 11/05/2007 à 15:46:17
La vie est une blague
Avatar
Groupe : Membres
[7][8] : Comment compiler sous Vista avec MinGW/GCC ?



Code::Blocks et MinGW



Le compilateur et le Code::Blocks


Il vous faut déjà tout le matériel nécessaire :


Comme le dit Nesquik69 dans son tutoriel, ne changez surtout pas le lieu d'installation !!!


Configurons MinGW




Je ne ferais là que citer ce message : Citation : forum hard ware
- Déplacer les fichiers suivant :
C:\MinGW\libexec\gcc\mingw32\3.4.5\cc1.exe => C:\MinGW\bin\cc1.exe
C:\MinGW\libexec\gcc\mingw32\3.4.5\cc1plus.exe => C:\MinGW\bin\cc1plus.exe
C:\MinGW\libexec\gcc\mingw32\3.4.5\collect2.exe => C:\MinGW\bin\collect2.exe


utilisez C:\MinGW\include et C:\MinGW\lib pour installer vos APIs


il se peut que se ne soit pas 3.4.5, cela revient au même !


Configurons C::B



Cette étape est peut-être facultative ! Mais vérifier toujours au cas où


Aller dans settings => Compiler and debugger...

Une fenêtre s'ouvre, sélectionnez GNU GCC Compiler dans la première liste déroulante puis toolchain executables dans la deuxième, cliquez sur auto-detect. Si dans la boîte texte à coté s'affiche C:\MinGW alors c'est bon ! sinon, recopier tout ce qu'il y a sur le screen ci-dessous :
Image utilisateur
Cliquez pour agrandir

Le Set as default sert juste à dire que vous utilisez ce compilateur par défaut, je le précise pour ceux qui ont utilisé VC++ Express édition® avant MinGW.


Je crois qu'il faut relancer l'IDE en suite, à vérifier.

Maintenant, vous devez mettre vos bibliothèques dans le dossier C:\MinGW\includes\ et C:\MinGW\libs\

Attention : Code::Blocks + Vista + MinGW = Javascript, on modifie un truc et tout plante :p


Secret (cliquez pour afficher)
Vous avez réussi ? Bravo ! Vous pouvez maintenant utiliser Code::Blocks avec votre OS préféré !


Dev-C++ et Cygwin



Là c'est extrêmement simple :
Aller, une petite aide : Lien de tréléchargement de cygwin


http://www.siteduzero.com/forum-83-122974-1111270.html#r1111270
http://www.siteduzero.com/forum-83-122974-1111980.html#r1111980



Et surtout, n'oubliez pas de relancez l'IDE !!!

ou encore :
http://www.siteduzero.com/forum-83-124218-1124904.html#r1124904



Vous pouvez maintenant compiler sous Vista avec Dev-C++
Édité le 04/09/2007 à 18:58:48 par smilz

Mon calendrier de l'avent ->
Image utilisateur
 
Hors ligne scriptoff # Posté le 18/05/2007 à 12:51:16
While I breath , I hope
Avatar
Groupe : Membres
[7][9]Les bases de gdb

Sous linux , aprés avoir compilé votre binaire avec le support debug( "-g" )

Code : Console
gdb votrebinaire


vous obtenez ceci :
-> (gdb)

je vais vous indiquer les commandes les plus utile :
r -> run , execute le binaire .
Si le problème de votre programme est un segfault , il s'arreteras à la ligne de votre code qui le provoque .

b-> breakpoints , interrompt le programme .
vous pouvez utiliser un numèros de ligne , une fonction .
permet d'explorer une fonction de votre code et vous executé le programme ligne par ligne , n-> ligne suivante .

l-> list , liste le code source .
Vous pouvez utiliser un nombre pour indiquer la ligne du milieu qu'il vas afficher .


p-> print , affiche une variable .
Il affiche tout ce que l'on veut : chaine de caractères , entiers.

q->quit , pour quitter

La complétion peut ètre utiliser via la touche tabulation.










Édité le 17/06/2007 à 19:46:34 par scriptoff
Hors ligne GuilOooo # Posté le 07/06/2007 à 20:54:26
PriPrOTtTt§!!!§
Avatar
Groupe : Membres
[6][3]Comment créer un OS ?

Faire un «vrai» OS, même s'il n'est qu'en console, est long et compliqué (si on veut avoir un truc correct, je parle pas d'un OS qui affiche «hello world» puis ne fait rien). Il va vous falloir plusieurs choses.

Pour faire un OS, donc, il vous faudra un langage de programmation tel que le C, mais aussi un assembleur (et faire de l'assembleur).
La toute première partie de votre OS, celle qui démarre l'ordi (le boot loader) doit être écrite en assembleur (à moins que vous preniez un soft qui fait le travail à votre place, comme GRUB.
Ensuite, certaines autre portions critiques seront faite en assembleur. Le reste, vous pouvez le coder en C.
Voici quelques liens pour vous orienter :

Le plus important et ce par quoi vous devriez commencer : un système d'exploitation, c'est quoi ?
Selon CommentCaMarche.net
Selon Wikipedia

Quelques systèmes d'exploitation et/ou noyaux que vous pouvez étudier :
BOSO Kernel, un tutoriel construit autour d'un exemple.
SOS (Simple OS), un OS tout simple dont vous pouvez étudier le code source.
Minix, un autre code intéréssant à étudier
proorOS, en C++, mais aussi utilisable (pour le boot sector par exemple)
Kernel Linux 1.0 ...

Tutoriaux sur les notions de système d'exploitation
PelleGrini sur developpez
Pagnotte sur developpez

Quelques tutoriaux sur le codage à proprement parler vont venir, faut que je les retrouve. En attendant, si vous avez des adresses à ajouter, envoyez moi un MP.
Édité le 15/06/2007 à 17:58:18 par GuilOooo
Hors ligne GuilOooo # Posté le 15/06/2007 à 18:10:44
PriPrOTtTt§!!!§
Avatar
Groupe : Membres
[3][3] Quand je compare ma variable avec un nombre dans un if, la condition est toujours vraie, même si elle n'est pas sensée l'être. Pourquoi ?

Probablement parceque vous vous êtes trompé d'opérateur. Vous avez utilisé '=' au lieu de '=='.

Mauvais exemple :Code : C
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buffer[32];
    int age = -1;

    /* Saisie de l'age */
    do
    {
        fgets(buffer, 32, stdin);
    } while( sscanf(buffer, "%d", &age) < 1);

    /* Bon je vous passe le nettoyage du buffer ici, mais
       theoriquement faudrait le faire */


    /* Le probleme se situe ici : il faut toujours deux '=' dans les conditions !! */
    if(age = 18) /* ERREUR */
    {
        puts("Vous etes devenu majeur cette annee !");
    }
    else
    {
        puts("Vous n'avez pas atteint votre majorite cette annee ci.");
    }

    return 0;
}


Correction :Code : C
/* Le reste du code est identique */
if(age == 18)
{
/* ... ... ... */


Que se passe t'il si je mets un seul égal ? Le compilateur ne dit rien ?
Eh bien, avec un seul égal, la variable va être modifiée pour contenir le nombre auquel vous l'affectez. Après quoi, cette nouvelle valeur sera comparée à zéro (comme dans «if(variable)»). Ce n'est pas du tout ce que vous voulez, mais en C, c'est parfaitement légal, donc le compilateur ne met pas d'erreur (enfin, s'il est perspicace, il vous sortira tout de même un warning).

L'opérateur ==, lui, compare la variable à la valeur. C'est cela que nous recherchons.

Si vous avez peur de vous tromper, utilisez cette astuce :
Code : C
if(18 == variable){

En effet, ce code est tout aussi correct (comparer 18 à variable revient au même que de comparer variable à 18), mais, si vous vous trompez, vous aurez une erreur de votre compilateur :
Code : C
if(18 = variable){ /*ERREUR */

En effet, ce code tente de mettre variable dans 18, ce qui n'a aucun sens car 18 est un nombre. Le compilateur vous le signalera et refusera de compiler. Ainsi, plus de risque d'erreur inaperçue.

Avec la participation d'Yno et de scriptoff
Édité le 16/06/2007 à 10:52:20 par GuilOooo
Hors ligne GuilOooo # Posté le 17/06/2007 à 15:54:28
PriPrOTtTt§!!!§
Avatar
Groupe : Membres
[3][4] Est-ce que j'ai le droit de faire if( variable == 1 || 2 || 3) ?

Hum... On rejoint un peu la question N°[3][3]. En gros, vous pouvez, mais il ne se passera pas ce à quoi vous vous attendez.

Petit rappel : le programme convertit toutes les conditions qu'il rencontre en nombres : 0 si la condition est fausse, une autre valeur sinon. Vous pouvez le vérifier :

Code : C
#include <stdio.h>

int main()
{
    int cond = ( 1+1 == 2 );
    printf("1+1 == 2 -> %d \n", cond);

    int cond2 = ( cond == 0 );
    printf("%d == 0 -> %d", cond, cond2);

    return 0;
}


Donnera un truc du style :

Code : Console
1+1 == 2 -> 1
1 == 0 -> 0


Ainsi, dans un if(), le programme rentre dans le bloc {} du if si le nombre obtenu après conversion est différent de 0. Ce qui signifie qu'il est possible d'écrire :

Code : C
{
    if(1)
    {
        /* Code toujours execute */
    }

    if(0)
    {
        /* Code jamais execute */
    }
}


Vous pouvez d'ailleurs remplacer 1 par n'importe quelle valeur différente de 0. Bon. Maintenant, observons ce code :

Code : C
if(variable == 1 || 2 || 3)


Admettons que variable contienne 1. La condition est vraie. Elle est alors transformée comme ceci :

Code : C
if( 1 || 2 || 3)


Vu qu'on utilise l'opérateur ||, soit "ou bien", il suffit que l'un de ces trois nombres soit différent de zéro pour que le bloc soit exécuté. comme 2 et 3 ne changent pas, c'est toujours le cas ! Donc cette condition sera toujours vraie, quelque soit la valeur de «variable». En fait, «2» et «3» sont évaluées comme des conditions séparées, et comme ce sont des chiffres différents de 0, ils sont toujours vrais.

Du coup, on est obligés de faire :

Code : C
if(variable == 1 || variable == 2 || variable == 3)
/* Remplacable par : */
if( variable >= 1 && variable <= 3)


Encore une fois, ici, le fait d'écrire cette mauvaise condition veut dire quelque chose en C, donc le compilateur ne vous engueulera pas (ou il vous donnera un warning au pire).
Hors ligne PianoPâriss # Posté le 18/06/2007 à 09:24:25
Mac Pro Bi-Xeon user
Avatar
Groupe : Membres

Tient, j'ai quelque chose d'intéressant:
@ edit >> ( :-° ), ah oui, j'utilise le mot 'case' pour donner une image, je sais que ce n'est pas très correct, mais bon...

Si vous avez un buffer (char []) qui contient un nombre par exemple en 'case' 12 (donc buffer[12] = LeNombreQueJeVeuxObtenirDansUnInt).
Vous allez donc devoir passer buffer à sscanf() ; Ok ?
Alors, vous vous dites, je dois faire:
Code : C - Afficher / masquer les numéros de ligne
  1. char buffer[64] = {0};
  2. int MonInt = 0;
  3. fgets(...buffer...); /* Maintenant (on va dire) notre buffer contient notre nombre en 'case' 12 */
  4. /* Puis, on doit faire: */
  5. char temp[2] = {buffer[12], 0};
  6. /* On doit créer une chaine ne contenant que le nombre à passer à sscanf(), on ne peut pas lui passer les 11 caractères avant le nombre... */
  7. if(sscanf(temp, "%d", &MonInt) != 1) puts("erreur...!");
  8. /*  ...  */


C'est énervant de devoir créer une chaine juste pour sscanf() non ?
(oui, rappelez vous, les programmeurs sont fénéants :p )

Et ben, voila le truc:
Code : C - Afficher / masquer les numéros de ligne
  1. sscanf((char []) {buffer[12], 0}, "%d", &MonInt);

Le compilo va créer une chaine, donc, pour lui ça ne change rien, mais pour nous, c'est vachement plus pratique :)

P.S. Il me semble qu'on peut aussi modifier l'argument 2 de sscanf() pour qu'il ne prenne que à partir du 12eme caractère mais bon, je préfère mon truc.
Édité le 20/10/2007 à 14:27:49 par PianoPâriss

Vive l'iPhone 3G ! :-°
Image utilisateur
Piano©~1
 
Hors ligne Yno # Posté le 18/06/2007 à 11:11:16
SCE
Avatar
Groupe : Membres
Je rappelle la différence entre les chiffres et les nombres :
http://fr.wikipedia.org/wiki/Chiffre

Citation : Zulon
Ou pas: si c'est juste un chiffre, c'est atoi(buffer[12]);

Soyez précis svp, car pour les chiffres, ceci est portable (merci candide) :
Code : C - Afficher / masquer les numéros de ligne
  1. int chiffre = buf[<id>] - '0';

De plus, atoi() attend un pointeur sur char, par un char, et pour finir elle est paraît-il dépréciée (elle et ses copines ato*).
http://www.siteduzero.com/forum-83-125906-1303181.html#r1303181

Et pour les nombres, en supposant que nous en ayons un qui commence en "case" 12 :
Code : C - Afficher / masquer les numéros de ligne
  1. long number = strtol(&buf[12], NULL, 0);
Édité le 19/10/2007 à 13:49:58 par Yno
Hors ligne Zoloom # Posté le 23/07/2007 à 01:02:28
Cauchemard compilatoire
Avatar
Groupe : Membres
[7|9] Exécuter une ou plusieurs fonction a la fermeture d'un programme :

Voila son prototype :

Code : C
#include <stdlib.h>
int atexit(void (*fonction) (void ));


Effrayant hein ? o_O

Mais non c'est tout bête. Cette fonction permet d'exécuter une ou plusieurs fonction a la fin d'un programme. Elle sont lancées par exit dans l'ordre inverse de leur positionnement par atexit.

Exemple :

Code : C

void coucou()
{

      printf("coucou\n");

}

void bonjour()
{

      printf("On dit bonjour malpoli!\n");

}

int main()
{
      atexit(bonjour);
      atexit(coucou);

      exit(0);
}


Bien sûr il faut rajouter des choses, mais s'est juste pour vous montrer :

Code : Console
coucou
On dit bonjour malpoli!


Il me semble que le nombre de fonction appelable grâce a atexit est limité, à 20 (à vérifier).
Édité le 23/07/2007 à 01:02:59 par Zoloom




 
Hors ligne Caribou87 # Posté le 23/07/2007 à 09:21:43
Groupe : Membres
Citation
POSIX.1-2001 nécessite que l’implémentation suive au moins ATEXIT_MAX
(32) pour que de telles fonctions soient enregistrées. La limite
actuelle de l’implémentation peut être obtenue avec sysconf(3).
Hors ligne bjarni3000 # Posté le 31/08/2007 à 23:49:36
Groupe : Membres
[7|1] Cause d'un phénomène avec les boucles simple...
Bonjour, je suis les cours de mateo depuis peu et donc comprend pas encore tout. J'ai testé le phénomène des boucles avec la petite fonction toute simple:

Citation : M@teo21

long nombreEntre = 0;

while (nombreEntre != 47)
{
printf("Tapez le nombre 47(ou autres)! ");
scanf("%ld", &nombreEntre);
}


Pour le tester ben j'ai rentré des chiffres puis me suis demandé ce que ça faisait si quelqun rentrait une valeur non-valable. J'ai donc mis une lettre, "e" en l'occurrence. Et ça n'a pas relancé la boucle contrairement à ce que je pensais mais à afficher un écran plutôt étrange...L'écran est plein de fois la même phrase,"Tapez le nombre47!"
Pourquoi mettre une lettre fait-elle cet effet-la à la boucle? pouquoi n'écrit-elle plus une question à la fois?

Peut-être que ma réponse se trouve plus loin dans le script aussi, si c'est le cas je suis dsl de vous embêter avec ça, j'y suis simplement pas encore...

Connecté Cyprien_ # Posté le 31/08/2007 à 23:53:31
Le Monde d'Akhiris
Avatar
Groupe : Membres
La réponse à ton problème se trouve à l'article 2|9 de cette FAQ : ici.
Par contre, la prochaine fois, ouvre un sujet à part pour poser tes questions ;) .

Un jeu online novateur ?
Le Monde d'Akhiris !
 
Hors ligne DOMTOM974 # Posté le 06/09/2007 à 10:07:26
Groupe : Membres
bonjour je voudrai savoir pourquoi ma version sdl 1.2.12
ne marche pas
je croi avoir vu la question quelque part et je ne trouve pas la reponse
ps jai 12ans
merci davance
Hors ligne Kevin Leonhart # Posté le 06/09/2007 à 14:28:46
Avatar
Groupe : Membres
Salut.

Crée un nouveau sujet pour ton problème, ici c'est l'endroit où on met les questions fréquemment posées et leurs réponses.

Et donne quelques indices dans ton nouveau post, parce que là avec "je voudrais savoir pourquoi ça marche pas", on peux faire des devinettes pendant une semaine au moins. ;)

"Je vous emmerde, et je rentre à ma maison."
Eric Cartman, philosophe.
 
Hors ligne jyma # Posté le 09/09/2007 à 16:13:07
bonjour
Groupe : Membres
escusé moi je ne compren rien
Connecté candide # Posté le 07/10/2007 à 22:13:04
"In code we trust"
Avatar
Groupe : Membres
Pas mal cette nouvelle mouture de la FAQ.
Citation : Yno
pour les chiffres, il me semble que ceci est portable :
Code : C - Afficher / masquer les numéros de ligne
  1. int chiffre = buf[<id>] - '0';

Oui, ça l'est, cf. le standard :
Citation : Norme C99

5.2.1 Character sets
[...]
In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.


Comme l'a observé psychoh13 sur le forum, ici, pour les encodages ASCII ou EBCDIC, c'est même vrai pour les 16 chiffres hexadécimaux.

EDIT
Lien exact vers la réponse de psychoh13
Édité le 17/11/2007 à 23:02:23 par candide


 
Hors ligne said78vf # Posté le 22/11/2007 à 01:18:07
Avatar
Groupe : Membres
Citation : PianoPâriss

Tient, j'ai quelque chose d'intéressant:
@ edit >> ( :-° ), ah oui, j'utilise le mot 'case' pour donner une image, je sais que ce n'est pas très correct, mais bon...

Si vous avez un buffer (char []) qui contient un nombre par exemple en 'case' 12 (donc buffer[12] = LeNombreQueJeVeuxObtenirDansUnInt).
Vous allez donc devoir passer buffer à sscanf() ; Ok ?
Alors, vous vous dites, je dois faire:
Code : C - Afficher / masquer les numéros de ligne
  1. char buffer[64] = {0};
  2. int MonInt = 0;
  3. fgets(...buffer...); /* Maintenant (on va dire) notre buffer contient notre nombre en 'case' 12 */
  4. /* Puis, on doit faire: */
  5. char temp[2] = {buffer[12], 0};
  6. /* On doit créer une chaine ne contenant que le nombre à passer à sscanf(), on ne peut pas lui passer les 11 caractères avant le nombre... */
  7. if(sscanf(temp, "%d", &MonInt) != 1) puts("erreur...!");
  8. /*  ...  */


C'est énervant de devoir créer une chaine juste pour sscanf() non ?
(oui, rappelez vous, les programmeurs sont fénéants :p )

Et ben, voila le truc:
Code : C - Afficher / masquer les numéros de ligne
  1. sscanf((char []) {buffer[12], 0}, "%d", &MonInt);

Le compilo va créer une chaine, donc, pour lui ça ne change rien, mais pour nous, c'est vachement plus pratique :)

P.S. Il me semble qu'on peut aussi modifier l'argument 2 de sscanf() pour qu'il ne prenne que à partir du 12eme caractère mais bon, je préfère mon truc.

Attention, les litéraux composés sont une nouveauté de C99, tous les compilateurs ne l'implémentent pas.
Hors ligne bagnthi # Posté le 30/01/2008 à 19:16:11
Groupe : Membres
merci pour vos reponses :p
Édité le 31/01/2008 à 13:00:11 par bagnthi
Hors ligne boss_78 # Posté le 16/02/2008 à 18:45:45
Groupe : Membres
Citation : Kevin Leonhart
[6][1] Comment créer un MMORPG ?
    [...]
  • Sais-je programmer correctement dans le langage que j'ai choisit ?
  • Ais-je de bonnes connaissances d'un moteur 3D ? physique ?
  • Ais-je une expérience des gros projets en programmation ?
  • Ais-je une bonne expérience de la programmation réseaux ?
  • Pourquoi diantre faut il plusieurs années à des équipes de professionnels payés qui ne font que ça de leurs journées pour mettre au point un MMORPG ?



Je pense que ce n'est pas tout à fait exact, je vais reprendre point par point.
  • Oui il faut savoir programmer dans le langage informatique qu'on a choisi
  • Non les MMORPG en 2D existent, certains ont un physique plutôt austère même voir totalement repoussant!
  • Oui et non. La création d'un MMORPG est un TRES gros projet par rapport à la majorité des projets qu'on trouve ici mais non ce n'est pas aussi compliqué (tout est très relatif) s'il s'agit d'un MMORPG assez basique, il peut même être assez joli (en connaissant 2/3 graphistes excellents avec pas mal de temps devant eux
  • Rien à redire sur le besoin d'expérience en programmation réseau
  • Les MMORPG ne sont pas tous fait par 800 personnes d'une société bourrée de fric.
    Un exemple avec la page des contributeurs (dev mais aussi testeurs, packaqeurs...) de The Mana World : http://sourceforge.net/project/memberlist.php?group_id=106790

En gros je dirais que MMORPG!=WoW
Hors ligne 1337833K # Posté le 14/04/2008 à 14:58:09
fgsfds
Groupe : Membres
[7][10] Comment récupérer un fichier se trouvant sur un serveur distant ?

C'est relativement compliqué, car un simple fopen() ne fonctionne pas.
Vous devez employer l'API Socket de votre système, puis dialoguer avec le serveur distant dans le protocole adéquat.

Image utilisateur
Big Brother is watching you.
The chocolate is a lie !
Vous pouvez faire un geste gratuit pour changer le monde. :)
Libérez quelqu'un et quelqu'un-d'autre !
 
Hors ligne amirault.tony # Posté le 17/04/2008 à 22:32:09
Vivre au jour le jour La nuit
Groupe : Membres
J'aimerai savoir s'il est possible de faire
for (i=0;i<nb;i++)
{
if (x[0]==y[i]);
}

J'ai une requête,
euh... Non une quête !
 
Hors ligne GuilOooo # Posté le 18/04/2008 à 11:22:38
PriPrOTtTt§!!!§
Avatar
Groupe : Membres
Amirault.tony, ici c'est pour les questions récurrentes fréquemment postées sur les forums. On ne poste que les couples question/réponse.

Si tu as une question particulière, à mon avis, tu devrais créer un nouveau topic pour exposer ton problème ;) .

Sinon, à priori ton code n'a pas de problème particulier, mais il ne fait absolument rien. Donc je pense qu'il ne donne pas le résultat que tu espères. Tu devrais, dans ton topic, expliquer ce à quoi tu veux parvenir en détails...
Hors ligne SonOfGod # Posté le 11/06/2008 à 21:58:14
Groupe : Membres
Rectificatif , il est possible d'effacer l'ecran en C et mais de le placer à un endroit precis.

mais c'est avec le compilateur BORLAND C++.
NB :avec DEV C++ impossible!!!

il suffit d'utiliser la bibliotheque
"conio.h"
EFFACER: appeler la fonction clrscr();

afficher à un endroit preci:
apeller gotoxy(c,l); qui se place devant le la fction d'affichage
c=n° de colonne
l=n° de ligne

dc pour afficher "bonjour" à la colone 2 ligne 3 il faut faire.


gotoxy(2,3);printf("bonjour");
Hors ligne GuilOooo # Posté le 12/06/2008 à 12:39:10
PriPrOTtTt§!!!§
Avatar
Groupe : Membres
Citation : SonOfGod
Rectificatif , il est possible d'effacer l'ecran en C et de le placer à un endroit precis.

mais c'est avec le compilateur BORLAND C++.
NB :avec DEV C++ impossible!!!

EDIT : le souligné est de moi.


Ça va, tu sens pas trop inutile ? Dans la FAQ on a dit :

Citation : Kevin Leonhart
[2][3] 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.


Donc en fait tu ne rectifies rien, tu ne fait que redire la même chose en moins bien.

De plus, Conio.h existe pour Dev-C++, elle y a été portée, mais par contre il faudra peut-être l'installer.

Enfin, quitte à utiliser une bibliothèque tièrce pour faire ce boulot, autant en prendre une portable, ça mange pas de pain et c'est sympa pour ceux qui ont choisi un OS différent du tien.
Édité le 12/06/2008 à 12:43:35 par GuilOooo

Retour au forum "Langage C" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 232 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.03s (0.0103s)