Mots dans variable
Résolu/Fermé
fffd
-
Modifié par fffd le 26/01/2013 à 14:08
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 28 janv. 2013 à 21:58
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 28 janv. 2013 à 21:58
A voir également:
- Mots dans variable
- Identifiants et mots de passe - Guide
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret ✓ - Forum Python
- Inverser 2 mots dans une cellule excel ✓ - Forum Excel
- Il veut recevoir les messages de louna mais ne plus voir ses photos dans son fil d'actualité sur facebook. il doit un ou plusieurs mots louna. - Forum Facebook
2 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 811
26 janv. 2013 à 14:17
26 janv. 2013 à 14:17
Si la chaîne doit rester constante (n'a pas de raison d'être modifiée) :
Sinon :
Par contre attention. Tu vas sans doute voir par la suite ce que sont des pointeurs en C. C'est implicitement ce que tu utilises ici car il n'y a pas de type "string" en C.
Le fait d'utiliser des pointeurs entraîne quelque subtilités, et donc un "char *" ne se manipule pas aussi simplement que si tu manipulais par exemple un int.
Par exemple, si tu veux copier mot1 dans mot2, il faut t'assurer que mot2 a été au préalable alloué (avec malloc) avant de copier mot1 dans mot2 (par exemple avec strcpy). Si tu écrit mot1 = mot2, tu ne recopies pas la chaîne, c'est simplement que mot1 désigne la même zone mémoire que mot2.
En fait la notation "truc *" désigne une adresse qui pointe sur un truc. En l'occurrence à l'adresse "mot" se trouve un caractère (la lettre 'd'), d'où la notation char *. En C écrire mot[i] consiste à regarder le caractère placé i cases de taille char après l'adresse mot. Ainsi on mot[i] = *(mot + i). C'est d'ailleurs pour ça qu'en C on compte à partir de 0. Ainsi dans un mot de n lettres, mot[0] désigne la 1ère lettre, mot[1] la seconde etc... mot[n-1] la dernière lettre.
Les fonctions du genre strcpy et strcmp partent du principe qu'à la position "n" il y a le caractère '\0' au bout de la chaîne, ce qui évite d'avoir à passer cette valeur n en paramètre. Quand on écrit :
char * mot = "dupond";
... implicitement, mot stocke l'adresse d'une chaîne constante contenant 'd','u','p','o','n','d','\0'.
Bonne chance
const char * mot = "dupond";
Sinon :
char * mot = "dupond";
Par contre attention. Tu vas sans doute voir par la suite ce que sont des pointeurs en C. C'est implicitement ce que tu utilises ici car il n'y a pas de type "string" en C.
Le fait d'utiliser des pointeurs entraîne quelque subtilités, et donc un "char *" ne se manipule pas aussi simplement que si tu manipulais par exemple un int.
Par exemple, si tu veux copier mot1 dans mot2, il faut t'assurer que mot2 a été au préalable alloué (avec malloc) avant de copier mot1 dans mot2 (par exemple avec strcpy). Si tu écrit mot1 = mot2, tu ne recopies pas la chaîne, c'est simplement que mot1 désigne la même zone mémoire que mot2.
En fait la notation "truc *" désigne une adresse qui pointe sur un truc. En l'occurrence à l'adresse "mot" se trouve un caractère (la lettre 'd'), d'où la notation char *. En C écrire mot[i] consiste à regarder le caractère placé i cases de taille char après l'adresse mot. Ainsi on mot[i] = *(mot + i). C'est d'ailleurs pour ça qu'en C on compte à partir de 0. Ainsi dans un mot de n lettres, mot[0] désigne la 1ère lettre, mot[1] la seconde etc... mot[n-1] la dernière lettre.
Les fonctions du genre strcpy et strcmp partent du principe qu'à la position "n" il y a le caractère '\0' au bout de la chaîne, ce qui évite d'avoir à passer cette valeur n en paramètre. Quand on écrit :
char * mot = "dupond";
... implicitement, mot stocke l'adresse d'une chaîne constante contenant 'd','u','p','o','n','d','\0'.
Bonne chance
kratosmindfreak
Messages postés
43
Date d'inscription
mercredi 23 janvier 2013
Statut
Membre
Dernière intervention
1 février 2013
26 janv. 2013 à 17:31
26 janv. 2013 à 17:31
char mot[tailledemot]="";
ou bien char *mot;
ou bien char *mot;
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 811
26 janv. 2013 à 21:53
26 janv. 2013 à 21:53
Il faut préciser que la première déclaration que tu proposes ne marche que si tu connais la valeurdetailledemot à la compilation (ie si c'est une constante, par exemple une valeur en dur (genre 10) ou un const unsigned int).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
27 janv. 2013 à 20:51
27 janv. 2013 à 20:51
Non, le const unsigned int n'est pas correct en C. Pas de variable dans type variable[...]. Ou alors #define.
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 811
28 janv. 2013 à 00:22
28 janv. 2013 à 00:22
Justement ce n'est pas une variable, c'est une constante et tu verras que dans ce cas, ça compile tout à fait et sans warning, en tout cas avec gcc...
#include <string.h> #include <stdio.h> int main() { const unsigned n = 20; char mot[n]; strcpy(mot, "coucou"); printf("%s\n", mot); return 0; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
28 janv. 2013 à 21:58
28 janv. 2013 à 21:58
Non. const ce n'est pas une vraie constante. Techniquement, il s'agit d'une variable en lecture seule. En C89/90, il est impossible de mettre une variable de type const unsigned dans un tableau statique comme tu l'as fait dans ton code. Si tu actives les bons flags, gcc doit te signaler que c'est interdit.
En revanche, en C99, c'est tout à fait possible via le mécanisme des VLAs.
Et de manière plus étendue, tu peux très bien faire : int n = 20; char mot[n]; (pas besoin de const.)
Bref, en C89/90, pour utiliser un tableau statique, il n'y a pas mille façons :
C'est : type nom[5]; ou alors avec #define.
En revanche, en C99, c'est tout à fait possible via le mécanisme des VLAs.
Et de manière plus étendue, tu peux très bien faire : int n = 20; char mot[n]; (pas besoin de const.)
Bref, en C89/90, pour utiliser un tableau statique, il n'y a pas mille façons :
C'est : type nom[5]; ou alors avec #define.