IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Aide pointeur / type de variable char.


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut Aide pointeur / type de variable char.
    Bonjour,

    Moi et un amis devons développer pour les cours un algorithme de chiffrage minimaliste.

    comme d'autre groupe nous avons écris un algorithme de type réversible facilement déchiffrable car le but est juste de rendre illisible pour le commun des mortels le texte de départ.

    Seulement, la ou ça coince c'est qu'on nous lance dans le C après avoir fait du VB, le tout sous linux avec comme seule obligation l'utilisation de l'ide CodeBlock et le compilateur GCC.

    N'ayant pas de grande expérience en C, et ayant juste reçu un PDF avec les bases j'ai pris les devants et je viens vous poser quelques question.

    Dans un premier temps, nous devons comparer les caractères à chiffrer avec un dictionnaire de caractère autorisé.

    Le dictionnaire est dinamyque et sera charger par une fonction dont l'entête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void loaddico(char * dico)
    du fait la fonction renverrait une chaîne de caractère à la manière de :
    dico = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Rien à faire, ça ne fonctionne pas, je ne suis pas assez à l'aise avec les " pointeurs " que nous avons à peine découvert dans le cours et dont nous n'avons pas parlé.

    En dehors de ça, j'aurais une fonction qui testerais chaque caractère vis à vis du dictionnaire

    j'ai pensé à quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    for (i = 0; j < textlen; i++)
    {
     
          testcar = 1;
          for (j = 0; j < dicolen; j++)
          {
     
                  if(mid(text, i, 1) == mid(dico, j, 1)
                  {
                           testcar = 0;
                           //sortir de ma boucle for, comment ?
     
                  }
     
     
     
            }
     
            if(testcar == 1)
            {
                    return 1;
            }
     
    }
    Mon premier soucis est que quand je test le caractère, si je vois qu'il correspond à un de ceux du dictionnaire, je dois pouvoir sortir de ma boucle for, je ne sais pas comment

    mon deuxième c'est qu'ici j'ai écris une fonction VB qui s'appelle mid, qui permet d'extraire un caractère d'une chaîne string, sauf que si j'ai bien compris, le type char est un peu l’ancêtre de string, et ne fonctionne pas du tout de la même manière.

    Quelqu'un pourrait me mettre sur la voie, déjà à me dire comment je peu charger mon dictionnaire dans la première fonction, en suite tester les caractères ?

    Je vous remercie d'avance pour l'aide apporté.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Déjà utilise les balises CODE s'il te plait.

    Pour ton for, tu peux sortir de deux manières :
    - avec break
    - avec les opérateurs logiques || et && dans ta condition pour avoir condition1 && condition2 (si les deux conditions sont réalisées) ou condition1 || condition2 (si au moins une des deux condition est réalisée)

    Pour un string, tu as beaucoup de fonctions pour rechercher des caractères, pour couper, pour supprimer un bout du string, ... je pense que dans la FAQ du devrais trouver pas mal de choses.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    salut,

    Pour ton premier problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void loaddico(char * dico)
    Pourquoi veux-tu que cette chaine soit chargée de façon dynamique (est-ce vraiment utile ?) ?

    Il y a plusieurs méthodes possibles. En voici deux :

    La première est de copier la chaine dans la variable passée en paramètre. Ton prototype risque de poser des problèmes car il ne gère pas la taille max du buffer passée en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
     
    // renvoi -1 si erreur, sinon la taille de la chaine
    // - buf_inout : buffer dans lequel on veut récupérer les données
    // - len_in : taille du buffer
    int loaddico(char * buf_out, int len_in){
     
    	const char pattern[] = "abcd...z"; 
     
    	if(sizeof(pattern) > len_in){
    		buf_inout[0] = '\0'; // retourne une chaine vide
    		return -1;
    	}
     
    	memcpy(buf_out, pattern, sizeof(pattern));
    	//on peut faire aussi : strcpy(buf_out, pattern);
     
    	return sizeof(pattern);
    }
     
    int main(void){
     
    	char dico[100];
     
    	if (loaddico(dico, sizeof(dico))){
    		printf("Erreur, taille de dico trop petite\r\n");
     
    	} else {
    		printf("dico : %s\r\n", dico);
     
    	}
    }
    => cette méthode permet de pouvoir modifier par la suite la chaine dico car dico n'est pas de type 'const' (est-ce nécessaire ?)

    second methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    // renvoi pointeur sur la chaine
    const char* loaddico(void){
     
    	const char pattern[] = "abcd...z"; 
     
    	return pattern;
    }
     
    int main(void){
     
    	const char *dico; // pointeur de 'const char' => on ne connait pas la taille de la chaine (il faut faire un strlen(dico))
     
    	dico = loaddico(); // il n'y a pas d'erreur possible
    	// On pourrait aussi faire :
    	dico = "abcd...z";
    	// => Pourquoi ne pas utiliser cette méthode ? 
     
     
    	printf("dico : %s\r\n", dico);
    }
    => on ne peux pas modifier la valeur pointée par dico



    Petit résumé des types de variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    	char val = 'a'; // variable modifiable contenant un caractère
    	// val = 'b'; // on a donc le droit de modifier la valeur après initialisation 
     
    	const char val2 = 'a'; // variable non-modifiable contenant un caractère
    	// val = 'b'; // cette ligne génère une erreur
     
    	char * ptVal; // pointeur sur une variable de type char (un pointeur contient une adresse mémoire et non pas une valeur)
    	ptVal = &val; // récupère l'adresse de la variable val
    	printf("%c\r\bn", *ptVal); // affiche la valeur pointé par ptVal (en l'occurence dans ce cas, ça affiche la valeur de val)
     
    	char buf[10]; // alloue un tableau de 10 octets
    	// buf peut être vu comme un pointeur dont on a reservé un espace mémoire de 10 octets => *(val+1) équivaut à val[1]
     
    	char buf[2] = "abcdefg"; // génère une erreur à la compilation car le tableau est trop petit
     
    	const char * const buf2 = "toto"; // pointeur constant sur variable de type 'const char'
    	// => on ne peut modifier ni la valeur de buf2 (l'adresse), ni la valeur pointée

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut
    Merci pour vos réponses, j'ai pu faire avec les bouts de codes proposé ici,

    merci vraiment pour l’efficacité.

Discussions similaires

  1. Réponses: 14
    Dernier message: 10/03/2014, 16h11
  2. Pointeur sur variable : char * str = "foo";
    Par gangsoleil dans le forum C
    Réponses: 8
    Dernier message: 18/12/2013, 15h35
  3. Réponses: 8
    Dernier message: 01/03/2012, 14h45
  4. Réponses: 6
    Dernier message: 31/03/2011, 08h55
  5. convertir une variable de type MYSQL_ROW EN CHAR
    Par Invité(e) dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/11/2009, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo