Langage C - probleme avec type char
Résolu
Jackho03
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour a tous,
je débute en C et je heurte malheureusement sur quelque chose de tres bete ....
Je voudrais réaliser un code qui récupere par "scanf" une chaine de caractere et apres je fais un test suivant le caractere entré.
Voici mon code :
Deja quand je rentre avec le scan f la chaine de caractere il ne me prend en compte qu'un seul caractere (le premier). J'ai essayé de remplacer %c par %s mais la le programme ne fonctionne pas!!
Quand je fais le printf pour afficher ce qui est dans la variable "var" il m'affiche la bonne lettre de la chaine de caractere precedemment entrée. Mais au niveau du test if meme si cette lettre est un 'F' dans la variable taille_entete_N2 il m'affichera 28 !
Exemple de ce que ca m'affiche quand je compile :
Alors que normalement il aurait du etre affiché 28 et non 6 !!
Quelqu'un peut m'expliquer pourquoi j'ai autant de mal a faire quelque chose d'aussi simple :P
Bonne soirée a tous !
je débute en C et je heurte malheureusement sur quelque chose de tres bete ....
Je voudrais réaliser un code qui récupere par "scanf" une chaine de caractere et apres je fais un test suivant le caractere entré.
Voici mon code :
#include <stdio.h> int main( void ) { char var; int taille_entete_N2; printf("\n Choisissez Ethernet (E) ou FrameRelay (F)\n"); scanf ("%c", &var); printf("chaine de caractere : %c",var); if (var = 'E') { taille_entete_N2 = 28; } if (var = 'F') { taille_entete_N2 = 6; } printf("\n taille : %d",taille_entete_N2); }
Deja quand je rentre avec le scan f la chaine de caractere il ne me prend en compte qu'un seul caractere (le premier). J'ai essayé de remplacer %c par %s mais la le programme ne fonctionne pas!!
Quand je fais le printf pour afficher ce qui est dans la variable "var" il m'affiche la bonne lettre de la chaine de caractere precedemment entrée. Mais au niveau du test if meme si cette lettre est un 'F' dans la variable taille_entete_N2 il m'affichera 28 !
Exemple de ce que ca m'affiche quand je compile :
Choisissez Ethernet (E) ou FrameRelay (F) Ethernet //correspond au scanf chaine de caractere : E taille : 6
Alors que normalement il aurait du etre affiché 28 et non 6 !!
Quelqu'un peut m'expliquer pourquoi j'ai autant de mal a faire quelque chose d'aussi simple :P
Bonne soirée a tous !
A voir également:
- Langage C - probleme avec type char
- Langage ascii - Guide
- Langage binaire - Guide
- Clear type - Guide
- Coco char - Accueil - Réseaux sociaux
- Type de ram - Guide
5 réponses
C'est bon j'ai compris .... il suffisant de mettre == a cette endroit :
if (var = 'F')
donc ca devient
if (var == 'F')
assez stupide .....
Sinon j'ai un autre soucis :
Je veux donc l'afficher sous forme de tableau mais voici ce qu'il m'affiche :
Il me prend la derniere lettre du mot !
De plus si j'essaye de mettre le mot Ethernet a la place de Ethe donc :
char data[2][2] = {
{'A','Ethernet'},
{'B','FrameRelay'}
};
il me met une erreur "illegal caracter constant".
Que dois-je faire pour résoudre ces 2 problemes ???
Merci
if (var = 'F')
donc ca devient
if (var == 'F')
assez stupide .....
Sinon j'ai un autre soucis :
int main( void ) { char data[2][2] = { {'A','Ethe'}, {'B','Fram'} }; printf( "\t%c \t%c\n", data[0][0],data[0][1] ); printf( "\t%c \t%c\n", data[1][0],data[1][1] ); }
Je veux donc l'afficher sous forme de tableau mais voici ce qu'il m'affiche :
A e B m
Il me prend la derniere lettre du mot !
De plus si j'essaye de mettre le mot Ethernet a la place de Ethe donc :
char data[2][2] = {
{'A','Ethernet'},
{'B','FrameRelay'}
};
il me met une erreur "illegal caracter constant".
Que dois-je faire pour résoudre ces 2 problemes ???
Merci
Salut,
#include<stdio.h> int main (void) { char *data [4] = { "A", "Ethernet", "B", "Fram" }; printf ("\t%c \t%c\n", **data, **(data+1)); printf ("\t%c \t%c\n", **(data+2), **(data+3)); return 0; }
Il faut faire la distinction entre un char (un caractère) entre ' ' et un char * (qu'on va appeler chaîne de caractère) qui est entre " ". Ainsi il ne peut y avoir par définition qu'un seul caractère entre deux ' ' (ou une séquence particulière, genre \n, \t, \r qui sont des caractères spéciaux).
Ce que tu peux faire c'est une structure. Dès qu'une structure de donnée devient un peu compliquée c'est la bonne façon d'encapsuler l'information. Par exemple dans ton cas ta structure se compose de deux caractères ('A', 'B') qu'on va stocker dans les champs car1 et car2, et de deux chaînes ("Ethernet" et "FrameRelay") qu'on va stocker dans str1 et str2.
Je suppose dans le code suivant que tu connais les notions suivantes en C:
- les structures
- les allocations mémoire (malloc)
Sous linux quand tu compiles et exécute le programme ça donne donc :
Si tu as besoin de précisions n'hésite pas !
Bonne chance
Ce que tu peux faire c'est une structure. Dès qu'une structure de donnée devient un peu compliquée c'est la bonne façon d'encapsuler l'information. Par exemple dans ton cas ta structure se compose de deux caractères ('A', 'B') qu'on va stocker dans les champs car1 et car2, et de deux chaînes ("Ethernet" et "FrameRelay") qu'on va stocker dans str1 et str2.
Je suppose dans le code suivant que tu connais les notions suivantes en C:
- les structures
- les allocations mémoire (malloc)
#include <stdio.h> #include <string.h> #include <stdlib.h> // Une structure permet de regrouper un ensemble d'attribut // dans un même type. struct data_t{ char car1; char car2; char *str1; char *str2; }; // Cette fonction alloue en mémoire une structure data_t // et initialise ses attributs. Qui dit allocation (malloc) // dit désallocation (free) le jour où on aura plus besoin de // ce qu'on a créé en mémoire. Ce rôle sera assuré par la // fonction del_data struct data_t * new_data(char c1,char c2,const char *s1,const char *s2){ struct data_t *d = (struct data_t *)malloc(sizeof(struct data_t)); d->car1 = c1; d->car2 = c2; d->str1 = (char *)malloc(strlen(s1)); d->str2 = (char *)malloc(strlen(s2)); strcpy(d->str1,s1); strcpy(d->str2,s2); return d; } // Ecrit le contenu de la structure void write_data(const struct data_t *d){ printf("%c\t%s\n",d->car1,d->str1); printf("%c\t%s\n",d->car2,d->str2); } // Efface la structure de la mémoire void del_data(struct data_t * d){ free(d->str1); free(d->str2); free(d); } int main(){ struct data_t *d = new_data('A','B',"Ethernet","FrameRelay"); write_data(d); del_data(d); return 0; }
Sous linux quand tu compiles et exécute le programme ça donne donc :
(mando@aldur) (~) $ gcc -W -Wall plop.c (mando@aldur) (~) $ ./a.out A Ethernet B FrameRelay
Si tu as besoin de précisions n'hésite pas !
Bonne chance
Merci beaucoup pour vous réponses.
==> Lami20j : j'ai essayé mais pareil ca ne m'affiche que la premiere lettre du mot !
==> mamiemando : ca marche impec !
Va falloir que je me remette dans tout ce qui est structure et malloc :P
Donc en fait si je veux utiliser un tableau (pas une structure) il faudra que ce soit un tableau d'entier !
Mais si je souhaite y mettre des chaines de caracteres je dois passer par des structures !!
Enfin bref un grand grand MERCI !!
Ce que tu m'as écris là me servira beaucoup si je dois utiliser d'autres structures ! (tres bien commenté et clair !)
bonne journée a vous tous !
Jackho
==> Lami20j : j'ai essayé mais pareil ca ne m'affiche que la premiere lettre du mot !
==> mamiemando : ca marche impec !
Va falloir que je me remette dans tout ce qui est structure et malloc :P
Donc en fait si je veux utiliser un tableau (pas une structure) il faudra que ce soit un tableau d'entier !
Mais si je souhaite y mettre des chaines de caracteres je dois passer par des structures !!
Enfin bref un grand grand MERCI !!
Ce que tu m'as écris là me servira beaucoup si je dois utiliser d'autres structures ! (tres bien commenté et clair !)
bonne journée a vous tous !
Jackho
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
==> Lami20j : j'ai essayé mais pareil ca ne m'affiche que la premiere lettre du mot !
mais ce ça que je voulais ;-)
en revanche je ne savais pas ce que tu voulais.
c'est toi qui voulais un caractère \t%c\n"
Donc en fait si je veux utiliser un tableau (pas une structure) il faudra que ce soit un tableau d'entier !
pas obligé
Mais si je souhaite y mettre des chaines de caracteres je dois passer par des structures !!
Non
Et voilà
L'utilisation des champs est très pratique et la lisibilité de ton programme est meilleure.
mais ce ça que je voulais ;-)
en revanche je ne savais pas ce que tu voulais.
c'est toi qui voulais un caractère \t%c\n"
Donc en fait si je veux utiliser un tableau (pas une structure) il faudra que ce soit un tableau d'entier !
pas obligé
Mais si je souhaite y mettre des chaines de caracteres je dois passer par des structures !!
Non
Et voilà
#include<stdio.h> int main (void) { char *data[4] = { "A", "Ethernet", "B", "Fram" }; printf ("\t%c \t%s\n", **data, *(data + 1)); printf ("\t%c \t%s\n", **(data + 2), *(data + 3)); return 0; }L'utilisation des structues c'est en fonction des besoins.
L'utilisation des champs est très pratique et la lisibilité de ton programme est meilleure.