Aller au menu - Aller au contenu

FAQ C

Pour accéder à cette section
Connectez-vous !
connexion_rpx
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
Modérateurs
Flux RSS

Reprise du dernier message de la page précédente :
[1][5] Quand je fais un scanf pour récupérer un nombre, si l'utilisateur tape une lettre, j'ai plein de problèmes. Que faire ?

Vous pouvez consulter lire ce tutoriel qui traite de scanf et de sa bonne utilisation.

Alternativement, vous pouvez vous passer de scanf, par exemple en utilisant fgets pour les entrées. Vous pouvez également consulter cet autre tutorial sur le même sujet.

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
Avatar

[5][4] 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
Connecté Kevin Leonhart # Posté le 28/04/2007 à 18:48:19
Monde de merde
Avatar

[8][4] 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
1
time_t temps = time(NULL);

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

Code : C
1
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
1
2
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
1
2
3
4
/* 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
1
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
1
2
3
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/* 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
Serenity is a RAID 1 array.
Avatar

[2][5] 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
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <windows.h> /* pour les fonctions GetConsoleOutputCP et associées */
 
/* Au début du programme, on récupère l'encodage
 * utilisé par la console. */
UINT default_codepage = GetConsoleOutputCP();
 
/* Puis, on change cet encodage pour imposer celui
 * que l'on veut (ici, page de code 1252). */
SetConsoleOutputCP(1252);
 
/* Le corps du programme. */
 
/* A la fin du programme, on restaure l'encodage initial. */
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(void)
{
    char texte[20] = "";
    CharToOemBuff("éééààà!", texte, sizeof texte - 1);
    puts(texte);
    return 0;
}

(Merci à tc pour avoir suggéré cette solution. :) )
Édité le 04/12/2007 à 13:25:10 par gouttegd
Hors ligne scriptoff # Posté le 01/05/2007 à 20:52:21
While I breath , I hope
Avatar

études : IUT Grenoble 2

[5][1]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
Avatar
Flux RSS

[4][1] 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
1
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
1
2
3
4
5
6
#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
1
2
3
4
5
6
#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 [...] -a-fgets.html

Pour convertir une chaîne formatée, vous pouvez utiliser sscanf() :
Code : C
1
2
3
4
5
6
7
8
9
#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
Avatar
Flux RSS

[8][6] 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
1
2
3
4
5
6
7
#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
1
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

[1][6]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 [1][1]).


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


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

Édité le 11/05/2007 à 20:23:50 par
Hors ligne smilz # Posté le 11/05/2007 à 15:46:17
La vie est une blague
Avatar
Flux RSS

Ville : Le barp
Pays : France métropolitaine

[5][2] Comment compiler sous Vista avec MinGW/GCC ?

Code::Blocks et MinGW



Cette partie est désormais obsolète, Code::Blocks est maintenant compatible avec Vista. je vous conseil donc de lire le tuto de Nesquik69 et Xaviou : http://www.siteduzero.com/tutoriel-3-2 [...] e-blocks.html


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\


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-122 [...] html#r1111270
http://www.siteduzero.com/forum-83-122 [...] html#r1111980



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

ou encore :
http://www.siteduzero.com/forum-83-124 [...] html#r1124904



Vous pouvez maintenant compiler sous Vista avec Dev-C++
Édité le 13/02/2010 à 10:16:16 par smilz
Hors ligne scriptoff # Posté le 18/05/2007 à 12:51:16
While I breath , I hope
Avatar

études : IUT Grenoble 2

[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.

Plus d'informations dans ce tutoriel.
Édité le 17/06/2007 à 19:46:34 par scriptoff
Hors ligne GuilOooo # Posté le 07/06/2007 à 20:54:26
PriPrOTtTt§!!!§
Avatar
Modérateurs
Flux RSS

[7][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 ne 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
Un autre cours, en PDF

EDIT : ce tutoriel remplace celui sur BosoKernel. Merci à ramiK de m'avoir envoyé le lien !

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 06/12/2009 à 16:18:54 par GuilOooo
Hors ligne GuilOooo # Posté le 15/06/2007 à 18:10:44
PriPrOTtTt§!!!§
Avatar
Modérateurs
Flux RSS

[6][1] 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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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
1
2
3
4
/* 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
1
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
1
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
Modérateurs
Flux RSS

[6][2] Est-ce que j'ai le droit de faire if( variable == 1 || 2 || 3) ?

Hum... On rejoint un peu la question N°[6][1]. 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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    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
1
if(variable == 1 || 2 || 3)


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

Code : C
1
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
1
2
3
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 se plaindra pas (ou il vous donnera un warning au pire).
Hors ligne PianoPâriss # Posté le 18/06/2007 à 09:24:25
Des hauts, des bas.
Avatar

Ville : Bruxelles
Pays : Belgique


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

Image utilisateur
 
Hors ligne Yno # Posté le 18/06/2007 à 11:11:16
Avatar
Flux RSS

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
Avatar

études : BTS IG Lyon

[8][5] Exécuter une ou plusieurs fonction a la fermeture d'un programme :

Voila son prototype :

Code : C
1
2
#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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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

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 candide # Posté le 07/10/2007 à 22:13:04
"In C ode we trust"
Avatar

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

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 boss_78 # Posté le 16/02/2008 à 18:45:45
☭ Court pour citation ☭

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
lock cmpxchg8b eax

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.
Hors ligne shareman # Posté le 18/10/2008 à 16:49:57
charlotte <3
Avatar

Ville : Mertzwiller
Pays : France métropolitaine

[2][6] Comment afficher correctement et simplement les caractères spéciaux dans la console ?

Les caractères spéciaux tels les accentués ne sont pas affichables "simplement" comme on voudrait le faire :
Code : C
1
printf("é");

Avec le précédent code, on affiche 'Image utilisateur', or on aimerait afficher 'é'.
Pour cela, l'une des meilleurs solutions consiste à passer par la valeur hexadécimale du caractère (cf la table ASCII) précédé de '\x'. le caractère spécial 'é' vaut 82 en hexa, donc pour l'afficher correctement, il faut corriger le code et compiler avec :
Code : C
1
printf("\x82")

On peut utiliser cette méthode pour tous les caractères, même les plus tordus comme le bip sonore (hex : 7).
Édité le 20/11/2008 à 17:45:21 par shareman
Hors ligne Koral # Posté le 29/01/2009 à 19:39:55
Avatar

études : EPITECH Bordeaux

Euh, crys', ton truc c'est bien gentil mais ça complique le code pour obtenir un résultat qui n'est de toute façon pas portable ...
Ta "solution" ne résout en aucun cas le fameux problème des caractères spéciaux de façon satisfaisante ...
Je crois que Vista affiche bien les accents maintenant (à confirmer svp) donc ça règlera le problème à terme.
Hors ligne ok # Posté le 26/07/2009 à 13:34:11
#!/bin/sh
Avatar

études : BTS IG Évry

[1][7] Quels sont les différentes séquences d'échappement avec printf et quels sont les différents formats à utiliser avec printf et scanf ?

J'ai remarqué qu'on posait souvent des questions du genre c'est quoi la différence entre %lf et %f ?. Il m'est donc venu l'idée de créer une liste qui présente les différentes séquences d'échappement et les différents formats avec printf et scanf, et à la demande de certains membres, j'ajoute cette liste à la FAQ.

Les séquences d'échappement (caractères spéciaux) avec printf :



Séquence d'échappementEffet
\n saut de ligne
\t tabulation horizontale
\v tabulation verticale
\b placement du curseur
\r retour chariot (carriage return)
\f saut de page
\a signal sonore
\\ antislash
\" double quote (guillemet)
%% Caractère "%"


Les formats de sortie avec printf :



FormatType de donnée
%d, %i nombre entier décimal
%u nombre entier non signé (unsigned)
%o nombre entier octal
%x nombre entier hexadécimal (minuscule)
%X nombre entier hexadécimal (majuscule)
%c caractère ASCII (type char)
%f nombre à virgule flottante
%e, %E nombre à virgule flottante au format exponentiel
%g, %G nombre au format %f ou %e (lorsque l'exposant est inférieur à -4)
%s chaîne de caractères
%p pointeur
%n pointeur (nombre de caractères déjà donnés)


Remarque :

Selon la man page de printf :

- Les formats %d à %X concernent les variables de type int. Pour les variables de type short, il faut ajouter un h après le % (exemple : %hd) et pour les variables de type long, il faut ajouter, il faut ajouter un l après le % (exemple : %ld).

- Les formats %f à %LG concernent les variables de type float. Pour les variables de type double, il faut ajouter un l après le % (exemple : %lf).

Il se peut toutefois que vous ayez un Warning du genre "ISO C90 does not support the `%lf' printf format". En effet, les formats %lf (nombre à virgule de type double), %hhd (char signé) et %hhu (char non signé) n'existent qu'en C99.

Les formats de saisie avec scanf :



FormatType de donnée
%d entier décimal de type int
%i nombre entier de type int
%hd entier décimal de type short
%ld entier décimal de type long
%u entier décimal de type int non signé (unsigned)
%hu entier décimal de type short non signé (unsigned short)
%lu entier décimal de type long non signé (unsigned long)
%o entier octal de type int
%ho entier octal de type short
%lo entier octal de type long
%x entier hexadécimal de type int
%hx entier hexadécimal de type short
%lx entier héxadécimal de type long
%c caractère ASCII (type char)
%f nombre à virgule flottante de type float
%lf nombre à virgule flottante de type double
%e, %E nombre à virgule flottante au format exponentiel de type float
%le, %LE nombre à virgule flottante au format exponentiel de type double
%g, %G nombre à virgule flottante au format décimal ou exponentiel (lorsque l'exposant est inférieur à -4) de type float
%lg, %LG nombre à virgule flottante au format décimal ou exponentiel (lorsque l'éxposant est inferieur à -4) de type double
%s chaîne de caractères
%p pointeur
%n aucune donnée utilisateur (montre le nombre de caractères déjà lus)


Si vous voyez une erreur, n'hésitez pas à me contacter par MP afin de corriger si cela s'avère pertinent ...
Édité le 08/03/2010 à 21:41:17 par ok
Hors ligne shareman # Message supprimé pour le motif suivant : Discussions sur la question précédente.
Hors ligne ok # Message supprimé pour le motif suivant : Discussions sur la question précédente.
Hors ligne shareman # Message supprimé pour le motif suivant : Discussions sur la question précédente.
Hors ligne ok # Message supprimé pour le motif suivant : Discussions sur la question précédente.
Hors ligne Blackis # Posté le 24/08/2009 à 10:50:41
Civilizaton is Over
Avatar

Lorsque je compile sous Code::blocks, ça me sort "Nothing to be done". Pourquoi ?

Tout simplement parce que le code::blocks n'a pas de compilateur configuré. Pour cela, il faut le faire manuellement :
Setting => Compiler and Debugger => Toolchain executable => Auto-detect.
Ça devrais marcher maintenant :)

Sinon, dans "Settings=>Compiler and Debugger=>Toolchain executables" (de votre logiciel code::Blocks), vous pouvez régler là où est le dossier "MinGW" à l'origine, c'est à dire : "C:\(Dossier d'instalation)\CodeBlocks\MinGW"

Avec la participation de Titi29.

Voir aussi Cette réponse.
Hors ligne ok # Message supprimé pour le motif suivant : Discussions sur la question précédente.
Hors ligne exterminator # Message supprimé pour le motif suivant : Discussions sur la question précédente.

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

Pour accéder à cette section
Connectez-vous !
connexion_rpx