logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] Problème de comparaison de caractère. [résolu]  (Lu 3476 fois)
mogg41

Profil challenge

Classement : 449/54285

Membre Senior
****
Hors ligne Hors ligne
Messages: 267

Mogg41 pour vous aider!


Voir le profil
« le: 22 Mars 2008 à 15:15:10 »

Bonjour à tous.

Je dois faire pour les cours un programme lisant un fichier contenant 1000 mots de passe puis de les analysez afin de déterminer les caractères les plus probables.

Le fichier est construit de la manière suivante:
Il y a un mot de passe par ligne chacun composé d'une lettre (A ou B) puis de 4 chiffres. Par exemple B0548 ou A7321.

Voici mon problème:
J'ai essayé de récupérer les mots de passe avec cette ligne de code:
Code:
char lettre0;
int chiffre0,chiffre1,chiffre2,chiffre3;
fscanf(f,"%c%d%d%d%d",&lettre0,&chiffre0,&chiffre1,&chiffre2,&chiffre3\n");

Mais le problème c'est que chiffre0 enregistre les 4 chiffres...

Je ai donc utilisé ce bout de code:
Code:
char lettre0,char0,char1,char2,char3;
fscanf(f,"%c%c%c%c%c\n",&lettre0,&char0,&char1,&char2,&char3");
Le problème a été résolu, mais un autre est apparu...

Je dois ensuite tester chaque caractère pour pouvoir comptabiliser le nombre 0, de 1... dans les mots de passe.
J'utilise ce bout de code:
Code:
int compteur=0;
while(compteur<10)
{
     if(char0==k)
         //instructions
     k=k+1;
}

Le problème est que pour comparer un char il faut mettre la syntaxe suivante char0=='k'; mais en utilisant cette syntaxe il me compare char0 à la lettre k et non pas à sa valeur...

J'ai réussi à comparer chaque caractère en utilisant un switch avec 10 possibilités, mais ce n'est pas du tout propre!

Peut être est-il possible de caster mon char0 en int mais il me semble qu'ils ne sont pas codées sur le même nombre de bits.

En espérant que vous aurez le courage de me lire et que vous aurez une piste pour moi, je vous souhaite de bons challenges!

Mogg41
« Dernière édition: 22 Mars 2008 à 16:58:02 par mogg41 » Journalisée

"Il ne savait pas que c'était impossible alors il l'a fait." Mark Twain
WiebeN
Profil challenge

Classement : 270/54285

Membre Junior
**
Hors ligne Hors ligne
Messages: 91


Voir le profil
« #1 le: 22 Mars 2008 à 15:26:22 »

A coup de fscanf tu te compliques un peu la vie à mon avis...
Moi je récupérerais chaque mot de passe avec un fgets, j'enlèverais le '\n' du dernier caractère et ensuite tu  fais un boucle pour comptabiliser chaque caractère... Un peu laborieux aussi, des pros trouveront probablement un algo bien plus performant mais celui ci devrait marcher ! (MP si besoin de plus de détails ou questions)

EDIT: en fait en y réfléchissant le mieux c'est de lire une fois tous les caractères du fichier, et de les comptabiliser directement. Jsais pas si je vais avoir le temps de te faire un  code d'illustration, sinon ce sera ce soir.
« Dernière édition: 22 Mars 2008 à 15:43:50 par WiebeN » Journalisée
WiebeN
Profil challenge

Classement : 270/54285

Membre Junior
**
Hors ligne Hors ligne
Messages: 91


Voir le profil
« #2 le: 22 Mars 2008 à 15:53:26 »

Voilà :
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char tab[42]; // Dans la table ASCII il y a 42 caractères entre 0 et Z
    char c;
    int i;
    FILE* fichier=fopen("pass.txt","r");

    for(i=0;i<=42;i++)
    tab[i]=0; //On place le compteur de chaque caractère à 0

    while ((c=fgetc(fichier))!=NULL && c!= EOF) // On lit tout le fichier
    {
        if( c>'0' && c<'Z') // Si le caractère lu est bien une lettre majuscule ou un chiffre (en réalité les caractères : ; < @ entre autres sont aussi acceptés ici mais tu peux y remédier)
        {
            tab[c-'0']++; On incrémente le compteur du caractère concerné (si c'est le chiffre 1, alors tab[1] va être incrémenté)
        }
    }
    fclose(fichier);

    for(i=0; i<=42; i++)
    {
        printf("Le caractere %c apparait %d fois !\n",(i+'0'),tab[i]);
    }

    return 0;
}
Je suis pas sur que ce soit portable sur toutes les plateformes mais pour windows et Linux ça devrait l'être !
« Dernière édition: 22 Mars 2008 à 16:04:14 par WiebeN » Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54285

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #3 le: 22 Mars 2008 à 16:24:25 »

Le problème est que pour comparer un char il faut mettre la synthaxe suivante char0=='k';

Non, ce n'est pas la seule syntaxe¹ : le type char est un numérique contenant le code ascii. On peut donc le comparer à une valeur numérique sans cast. Voir utiliser cette valeur comme indice dans un tableau.

¹: sans h. Au contraire d'algorithme.
« Dernière édition: 22 Mars 2008 à 16:27:46 par _o_ » Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
Spaulding

Profil challenge

Classement : 8/54285

Membre Complet
***
Hors ligne Hors ligne
Messages: 190


Voir le profil WWW
« #4 le: 22 Mars 2008 à 16:25:04 »

Je ne suis pas sur de tout bien comprendre donc de savoir si ça va t'aider, mais il se trouve qu'en ASCII, les chiffres ont la "magie" d'être codé de 30 à 39 (en hexa) => 'x'-0x30 = x.
Journalisée

---------------
mogg41

Profil challenge

Classement : 449/54285

Membre Senior
****
Hors ligne Hors ligne
Messages: 267

Mogg41 pour vous aider!


Voir le profil
« #5 le: 22 Mars 2008 à 16:50:00 »

Merci pour vos réponses.

Je me suis renseigné sur le type char et j'ai trouvé ceci:

Citation
Caractère (char)

Le type char (provenant de l'anglais character) permet de stocker la valeur ASCII d'un caractère, c'est-à-dire un nombre entier !

Par défaut les nombres sont signés, cela signifie qu'ils comportent un signe. Pour stocker l'information concernant le signe (en binaire), les ordinateurs utilisent le complément à deux. Une donnée de type char est donc signée, cela ne signifie bien sûr pas que la lettre possède un signe mais tout simplement que dans la mémoire la valeur codant le caractère peut être négative...

Si jamais on désire par exemple stocker la lettre B (son code ASCII est 66), on pourra définir cette donnée soit par le nombre 66, soit en notant 'B' où les apostrophes simples signifient code ascii de...

Il n'existe pas de type de données pour les chaînes de caractères (suite de caractères) en langage C. Pour créer une chaîne de caractères on utilisera donc des tableaux contenant dans chacune de ses cases un caractère...
Source:http://www.commentcamarche.net/cpp/cpptype.php3

Cela m'a permis de résoudre mon problème en modifiant un petit peu mon code:
Code:
int compteur=0;
while(compteur<10)
{
     if(char0==k+48)//+48 car le code ASCII de 0 est 48 (en base 10)
         //instructions
     k=k+1;
}


Merci encore.

Mogg41
« Dernière édition: 22 Mars 2008 à 16:57:27 par mogg41 » Journalisée

"Il ne savait pas que c'était impossible alors il l'a fait." Mark Twain
WiebeN
Profil challenge

Classement : 270/54285

Membre Junior
**
Hors ligne Hors ligne
Messages: 91


Voir le profil
« #6 le: 22 Mars 2008 à 19:28:42 »

Oui +48 ou +'0' marche aussi très bien
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: