Rechercher : dans
Par :

Compare :chaine de char en C

Dernière réponse le 4 jun 2002 à 17:07:05 sagemoi, le 3 jun 2002 à 12:36:44 
 Signaler ce message aux modérateurs

Char Chaine[2];
...

if ( Chaine == 'N1' ) printf ("vu N1\n");

le compilateur me jette :
Character constant 'N1' has more than one character.

comment faire simple ?

Meilleures réponses pour « compare :chaine de char en C » dans :
Les guillemets, apostrophes et les chaînes VoirComment jouer avec les guillemets et les apostrophes dans les chaînes 1. Préambule 2. Éviter une coupure dans la chaîne 3. Ajouter un guillemet dans la chaîne 3.1 Avec l'apostrophe 3.2 Avec l'ASCII 3.3 Directement 3.3.1 Méthode...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
PHP - Expressions régulières VoirQu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...

1

asevere, le 3 jun 2002 à 12:41:05

Salut alors si je me reppel bien en c pour une chaine de deux caractére il fo un char[3] pour '\0' (fin de chaine)
voila ca va peut-etre t aider...
si j ai une autre idée je reviens...

bye

Répondre à asevere

2

sagemoi, le 3 jun 2002 à 12:46:26

Negatif
car dans les 3 petits points il y a deja '\0' dans Chaine[2]
de plus le tableau a deja 3 cases ( 0 1 et 2 )

merci tout de meme

Répondre à sagemoi

5

asevere, le 3 jun 2002 à 14:09:28

Exact autant pour moi!
va falloir que je m'y remette serieux la...
j avais encore jamais faisz un telle bourde

Répondre à asevere

3

sebsauvage, le 3 jun 2002 à 13:01:26
  • +1

Attention !

quand tu fais Chaine == 'N1' tu ne compare pas 2 chaînes,
mais 2 pointeurs !

(Une chaîne est un pointeur sur un tableau de char).

Tu dois utiliser strcmp() pour comparer 2 chaînes.

Répondre à sebsauvage

4

sagemoi, le 3 jun 2002 à 13:40:03

C'est vrai !
donc il faut test le result du strcmp

mais alors comment fait on pour un switch case
d'une chaine de char ?

merci du rappel strcmp
fautqu'je li !

Répondre à sagemoi

6

Peguinette, le 3 jun 2002 à 18:09:57

Je suis d'accord aussi, il faut utiliser strcmp.

Mais il y a autre chose :
qd tu fais Chaine == 'N1' , tu compares ta chaine avec 1 caractere.
Or N1 c'est 2 caracteres.

Le simple cote est utilisé pour un caractere, et le double cote pour une chaine de caractere

Peguinette...
"Petit à petit on devient moins petit."

Répondre à Peguinette

7

sebsauvage, le 3 jun 2002 à 18:38:11

>mais alors comment fait on pour un switch case
>d'une chaine de char ?

J'ai plusieurs solutions:

Solution 1 : Tout ce qui n'est pas Python est souffrance. La disparition de la souffrance peut être atteinte en ne programmant pas en non-Python.

Solution 2 : si tu as une classe String, ça sera plus vite fait, mais comme on est en C et pas en C++, c'est raté.

Solution 3 : si tu as des routines de CRC ou de hash quelqconque, tu peux calculer un hash de la chaîne et faire un switch sur la valeur du hash.
Pas la peine de taper dans le MD5 ou SHA512: Si la chaîne est courte, une simple CRC16 suffira largement. On trouve des routines de CRC16 très rapides.

Solution 4 : faire plein de if strcmp()... (je sais c'est pas bô, mais en C brut de fonderie, j'ai pas mieux :-/

Répondre à sebsauvage

8

sagemoi, le 4 jun 2002 à 13:00:47

Merci pour ton message seb
cependant
peut tu developper la solution 2 en plus clair que la solution 3
laquelle ne m'a pas paru vraiment limpide :

quézako CRC , hash ,MD5 ,SHA512

merci de redescendre sur la planete bleu que ses habitants appelent la terre .


pour la solution1 : je ne connais pas Python (de quel langage cela ce rapproche?)
pour la solution 4 : c'est justement parceque je ne trouve pas ca beau que je rencheri sur la question

merci encore

Répondre à sagemoi

9

sebsauvage, le 4 jun 2002 à 13:53:00

Bien !

1) Python est un langage de script objet, clair, facile à apprendre, opensource, bourré de routine toutes prêtes, multiplaforme et ouvert (on peut l'interfacer avec d'autres langages comme C, C++, etc.) Voir http://www.python.org et http://www.rimbault.net/python.


2) La majorité des compilateurs C++ sont fournis avec des classes String (pas toujours super-bien construites, mais bon). Elles surchargent généralement l'opération de comparaison, ce qui permet - il me semble - de les utiliser dans les switch (arrêtez-moi si je dis une connerie).


3)
Le hashage est une opération très simple:
C'est une moulinette qui prend en entrée un nombre quelqconque d'octets et qui sort un nombre fixe d'octets.
Ces octets en sortie sont une sorte d'empreinte de la chaîne en entrée.
Deux chaînes identiques auront 2 hash identiques.
Si tu as 2 hash identiques, tu peux être sûr à 99,9999999% que les chaînes d'origine sont identiques.

Les hash sont massivement utilisés: dans les fichiers archive (ZIP, RAR...) pour s'assurer que les fichiers ne sont pas endommagés ; dans tous les systèmes d'exploitation pour vérifier la validité d'un mot de passe sans avoir à le stocker ; en crypto (ex:échanges bancaires, PGP, SSL/HTTPS...) pour signer des messages ou des certificats ; dans les bases de données pour construire des indexes ; etc.

Les hash étant généralement courts (ex: 32 bits pour une CRC32), l'ordinateur sait très bien les utiliser comme des nombres et les comparer dans des switch.
Il est plus facile de comparer 2 entiers (2 hashs) que 2 chaînes de caractères (c'est d'ailleurs ce qui est fait dans les bases de données pour les clés primaires).

Il existe différents types de hash (ou CRC). Pour comparer des chaînes de quelques centaines d'octets, une CRC16 suffit largement.

Répondre à sebsauvage

10

 sagemoi, le 4 jun 2002 à 17:07:05

Encore merci

Répondre à sagemoi
Collection CommentÇaMarche.net