Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/10/2007, à 12:06

ilu

Conversion d'une chaine de caractère

Bonjour à tous!

Etant novice en programmation, je me permets de faire appel à vous! tongue

Voila, pour un TD, il me faut écrire un programme tout "simple" pour convertir une chaine de caractère en majuscule!

J'ai déjà écrit mon algorithme, et commencé à coder. Le problème vient au niveau de... la conversion!!

Je sais qu'on utilise le code ASCII dans les chaines de caractères. Logiquement, si je ne me trompe pas, il faudrait ajouter une constante (qui doit être 32 en décimal, et 20 si on compte en héxa) à la valeur de chaque caractère de notre chaine, pour avoir la conversion.

Un exemple vaut mieux qu'un long discours, je mets ce que j'ai commencé à écrire:

#include <stdio.h>

main() {
  int i; /*définition de la variable de boucle.*/
  char chaine1[256]; /*définition de ma chaine de caractère.*/
  printf("Entrer une chaîne de caractères.\n");
  scanf("%s", chaine1);
  for (i=0; i<256; i++)

Je ne peux pas aller plus loin car j'ignore comment ajouter une constante à la valeur du caractère, pour chaque chaine1[i]!
La constante que l'on ajoute (si c'est bien ça) doit être exprimée comment? En décimal? En héxadécimal?
Comment puis-je le coder?

Merci beaucoup big_smile

Dernière modification par ilu (Le 28/10/2007, à 16:23)

Hors ligne

#2 Le 21/10/2007, à 12:23

Globox60

Re : Conversion d'une chaine de caractère

essaye :

chaine1[i]=chaine1[i]+0x20;

c pas sur que ca marche ca fait tres longtemps que j ai pas programmer

Hors ligne

#3 Le 21/10/2007, à 12:33

ilu

Re : Conversion d'une chaine de caractère

Merci pour ta réponse, mais je ne pense pas que ce soit cela. Et pour cause:

#include <stdio.h>

main() {
  int i;
  char chaine1[256];
  printf("Entrer une chaîne de caractères.\n");
  scanf("%s", chaine1);
  for (i=0; i<256; i++)
   chaine1[i]=chaine1[i]+0x20;
  printf("La nouvelle chaine de caractère est: %s", chaine1);
}

Je compile, je fais un essai, et j'obtiens la chose suivante:

Entrer une chaîne de caractères.
salut
La nouvelle chaine de caractères est: ����� �$   H���H���    Nn]                !   X(  (�� �ן�$(�W

Ca n'est pas vraiment ce qu'il me faut lol
En tout cas, merci pour ta réponse. En allant plus loin, si j'ai bien compris, il faut donc utiliser la constante en héxadécimale, pour effectuer la conversion, c'est ça?

Hors ligne

#4 Le 21/10/2007, à 12:35

Globox60

Re : Conversion d'une chaine de caractère

oui mais un des pb de ton prog est que tu defini ton tableau sur 256 case alors que tu ne sais meme pas combien il va en utiliser. essaye les pointeurs a la place

Hors ligne

#5 Le 21/10/2007, à 12:35

gene69

Re : Conversion d'une chaine de caractère

chaine1[i]=chaine1[i]+0x20;

sinon tu peux faire

chaine1[i]=chaine1[i]+'a'-'A';

cette méthode est magnifique pour convertir des char... mais attention tu risques aussi de convertir les '.', '0', '1', '2', et les '\0' ...
donc je te conseille de commencer par encadrer par un test.

if (( 'a' <= chaine1[i] ) && ( chaine1[i] <= 'z' ))
{
   chaine1[i]=chaine1[i]+'a'-'A';
}

Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#6 Le 21/10/2007, à 12:53

ilu

Re : Conversion d'une chaine de caractère

oui mais un des pb de ton prog est que tu defini ton tableau sur 256 case alors que tu ne sais meme pas combien il va en utiliser. essaye les pointeurs a la place

Oui, parce qu'on doit procéder de deux manières différentes: une en utilisant les pointeurs, et l'autre en utilisant les indices de tableau. C'est pour ça que j'ai fixé arbitrairement 256.

Gene69, lorsque j'utilise la première méthode, qui est donc la même que celle que m'a proposé Globox60, j'obtiens le résultat que j'ai dit. Fait étrange, de surcroit, la taille de la nouvelle chaine de caractère varie, et ce  n'est pas toujours la même lol
Du coup, j'ai essayé la méthode avec la condition.
Et cette fois, la casse est limitée, puisque j'obtiens:

La nouvelle chaine est: �����

Il y a le même nombre de caractère que dans "salut" ce qui est plutôt bon signe j'imagine. lol
Le fait que ce soit ce symbole étrange qui s'affiche peut-il être un problème extérieur au programme? Problème d'affichage, par exemple? (je dis ça, mais je n'en ai aucune idée! )

Hors ligne

#7 Le 21/10/2007, à 12:54

gene69

Re : Conversion d'une chaine de caractère

Bon je vais devoir le coder moi même.

Je reviens...


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#8 Le 21/10/2007, à 13:10

gene69

Re : Conversion d'une chaine de caractère

int main(void){


	int i = 0;
	char chaine1[256];
	sscanf("kj,qshjfdk4564qrg4r54fd3453!%$AAZEV*qSDGJJKkjhkd","%s", chaine1); // c'est merdique sscanf car on va pas pouvoir utiliser des espaces...

	
	printf("%s \n", chaine1);

	while ( chaine1[i] != 0 )
	{
		printf("%d [ %c %d ]",i,chaine1[i],chaine1[i] );
		if (( 'a' <= chaine1[i] ) && ( chaine1[i] <= 'z' ))
		{
		
		   chaine1[i]=chaine1[i]+'A'-'a';
		}
		printf(" [ %c %d ] \n",chaine1[i],chaine1[i] );
		i++;	
	}

	printf("%s \n", chaine1);

	return 0;
}

autant pour moi, les majuscules sont après les minuscules ...

Dernière modification par gene69 (Le 21/10/2007, à 13:13)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#9 Le 21/10/2007, à 13:28

ilu

Re : Conversion d'une chaine de caractère

D'accord, merci beaucoup. Effectivement, en remplaçant

chaine1[i]=chaine1[i]+'a'-'A';

par

chaine1[i]=chaine1[i]+'A'-'a';

on obtient ce qu'il faut.

Etant donné que je suis assez "chiant", j'aimerais comprendre pourquoi la première solution ne marche pas.

chaine1[i]=chaine1[i]+0x20;

J'ai remplacé le + par un -, vu que les majuscules sont avant les miniscules dans la table ASCII. Mais cela ne règle absolument pas le problème?

Bref, j'avoue ne pas comprendre...

Ah oui, autre point que j'aimerais aborder:
Lorsqu'on entre la chaine de caractère qu'on veut convertir en majuscule: est-il possible de mettre des espaces, pour que la chaine soit une phrase? Parce qu'apparemment, dès que j'introduis un espace dans la première chaine de caractère, la conversion s'arrête au premier mot. Les mots suivant ne sont même pas lus. neutral

edit: la lecture des espaces est impossible avec scanf (je l'ai remarqué sur ton code après coup). Il faut donc mettre

gets(chaine1)

pour que les espaces soient pris en compte.
J'aurait appris beaucoup de choses aujourd'hui lol

En tout cas, merci beaucoup à vous deux big_smile

Dernière modification par ilu (Le 21/10/2007, à 13:34)

Hors ligne

#10 Le 21/10/2007, à 13:36

gene69

Re : Conversion d'une chaine de caractère

bon simplement parce que les char sont codés sur des 8 bits et que la position relative du A et du a peuvent changer d'un systeme à l'autre. écrire la constante en dur faut être sur de son coup. En l'espèce ta constante est fausse (sans doute pas la bonne basse?) mais je refuse de savoir quelle est la bonne valeur.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#11 Le 21/10/2007, à 13:37

gene69

Re : Conversion d'une chaine de caractère

ne pas utiliser gets
man gets

BOGUES
       N’utilisez  jamais gets(). Comme il est impossible de savoir à l’avance
       combien de caractères seront lus par gets(), et comme  celui-ci  écrira
       tous les caractères lus, même s’ils débordent du tampon, cette fonction
       est extrèmement dangereuse à utiliser. On a déjà  utilisé  ce  dysfonc‐
       tionnement  pour créer des trous de sécurité. UTILISEZ TOUJOURS fgets()
       À LA PLACE DE gets().


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#12 Le 21/10/2007, à 14:20

ilu

Re : Conversion d'une chaine de caractère

Ah bon d'accord. Je vais mettre fgets à la place.

Merci pour toutes tes indications big_smile

Hors ligne

#13 Le 28/10/2007, à 16:23

ilu

Re : Conversion d'une chaine de caractère

Globox60 a écrit :

oui mais un des pb de ton prog est que tu defini ton tableau sur 256 case alors que tu ne sais meme pas combien il va en utiliser. essaye les pointeurs a la place

Bonjour. Je me permet de double poster, car j'essaie de comprendre comment aborder le problème de différentes manières.
Ici, on me conseille d'utiliser des pointeurs. J'ai appris la façon dont on peut les utiliser. Cependant, ici, je ne parviens pas à voir la manière dont on peu procéder.

Est-ce que quelqu'un pourrait m'éclairer?
Merci beaucoup

Hors ligne

#14 Le 28/10/2007, à 16:53

robrob

Re : Conversion d'une chaine de caractère

ilu a écrit :

Etant donné que je suis assez "chiant", j'aimerais comprendre pourquoi la première solution ne marche pas.

chaine1[i]=chaine1[i]+0x20;

J'ai remplacé le + par un -, vu que les majuscules sont avant les miniscules dans la table ASCII. Mais cela ne règle absolument pas le problème?

En C, une chaine de caractere se termine par le caractère '\0'.
Si tu convertis aussi ce caractère de fin de chaine, ca va marcher beaucoup moins bien.

Pour faire marcher ton premier programme, il ne faut convertir que la partie "utile de la chaine". Ca tombe bien pour ca tu as la fonction strlen (définie dans string.h) qui permet de connaître la longueur d'une chaine.

#include <stdio.h>
#include <string.h>

int main(void)
{
  int i; /*définition de la variable de boucle.*/
  char chaine1[256]; /*définition de ma chaine de caractère.*/
  printf("Entrez une chaine de caractères.\n");
  scanf("%s", chaine1);
  for (i=0; i<(int)strlen(chaine1); i++)
    etc.

edit: il va sans dire que si un utilisateur facétieux tape plus de 255 caractères, ça bug tongue

Dernière modification par robrob (Le 28/10/2007, à 16:56)

Hors ligne