Langage C - probleme avec type char

Résolu/Fermé
Jackho03 Messages postés 21 Date d'inscription vendredi 9 février 2007 Statut Membre Dernière intervention 31 octobre 2007 - 6 oct. 2007 à 21:14
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 7 oct. 2007 à 14:05
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 :

#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:

5 réponses

Jackho03 Messages postés 21 Date d'inscription vendredi 9 février 2007 Statut Membre Dernière intervention 31 octobre 2007
6 oct. 2007 à 21:26
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 :

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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 oct. 2007 à 22:46
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;
}

0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
7 oct. 2007 à 01:48
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)
#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
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 oct. 2007 à 14:05
==> 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à
#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.
0