je croyais que strcmp renvoyait renvoyait 0 ou 1 (0 lorsque les chaines sont identiques)Citation:
Envoyé par Médinoc
Version imprimable
je croyais que strcmp renvoyait renvoyait 0 ou 1 (0 lorsque les chaines sont identiques)Citation:
Envoyé par Médinoc
montre moi stp comment tu fais sans.Citation:
Envoyé par mujigka
selon moi, voila comment ça se passe :
chaine 1 : "hel lo". indice i : 5
chaine 2 : "hello". indice j : 4
Tu es d'accord que i et j ne s'incrémentent pas à la même vitesse. Donc si l'on ne met pas j, ça cloche quelque part (j'ai essayé :roll: ) ...
Ben non, strcmp() retourne 0 si les chaînes sont identiques, supérieur à zéro si la première chaîne est "supérieure" à la seconde, inférieur à zéro si la première chaîne est "inférieure" à la seconde.Citation:
Envoyé par olivier1209
Citation:
Envoyé par man strcmp() POSIX 2003
ok merci même si inferieur/superieur pour une chaine ça fait bizarre !Citation:
Envoyé par Médinoc
OK, tu as raison et je m'inclineCitation:
Envoyé par Médinoc
Thierry
Au contraire, je ne trouve pas cela plus clair...!Citation:
Envoyé par olivier1209
C'est mieux de définir tes chaînes de caractères sur la pile, dans le corps de main.Citation:
Envoyé par olivier1209
Thierry
Dans ta fonction inverser, i et j s'incrémentent à la même vitesse:Citation:
Envoyé par olivier1209
ThierryCode:
1
2
3
4
5
6 for(i = 0; i < n/2; i++) { c = sz2[i]; sz2[i] = sz2[n-i-1]; sz2[n-i-1] = c; }
Mes commentaires (pas de corrections tant que je vois des globales)Citation:
Envoyé par olivier1209
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 #include <stdio.h> #include <stdlib.h> #include <string.h> /* -ed- il n'y a aucune raison d'utiliser des globales pour un tel programme... Appendre à utilser les parametres des fonctions... */ char sz1[50], sz2[50]; // chaine de caractere sur lesquelles on travaille => variable globale /* -ed- eviter les commentaires longs en boutde ligne. Illisible... */ int compression (void) // compresse une chaine de caractere { int i, j, n = 0; j = 0; for (i = 0; sz1[i] != 0; i++) n++; for (i = 0; i < n; i++) if (sz1[i] != ' ') { sz2[j] = sz1[i]; j++; } strcpy (sz1, sz2); printf ("apres compression : %s\n", sz2); return 0; } /* -ed- Les globales, je ne peux pas, desole... je viens de vomir sur mon clavier, Merci c'etait un portable... */ int inversion (void) // inverse les caractères d'une chaine : abc=>cba { char c; int i, j, n; n = 0; j = 1; for (i = 0; sz2[i] != 0; i++) n++; for (i = 0; i < n / 2; i++) { c = sz2[i]; sz2[i] = sz2[n - j]; sz2[n - j] = c; j++; } printf ("apres inversion : %s\n", sz2); return 0; } int test_palindrome (void) { if (strcmp (sz1, sz2)) return 0; else return 1; } int main (int argc, char *argv[]) { gets (sz1); /* -ed- Demon ! Cette fonction est un bug. Elle est interdite pour les nouveaux developpements... Utiliser fgets() et penser a retiper proprement le \n... */ compression (); inversion (); if (test_palindrome ()) puts ("c'est un palindrome"); else puts ("ce n'est pas un palindrome"); system ("PAUSE"); return 0; }
C'est pas plus illogique queCitation:
Envoyé par Médinoc
au lieu deCode:
1
2
3
4
5 x <- 1 (LDA) x := 1; (Pascal) x = 1; (C) MOV x, #1 (ASM86)
C'est une convention, c'est tout. Evidemment, les farceurs de Freescale (ex-Motorola pour les retardataires) utilisent une convention inverse en assembleur, histoire de se faire remarquer...Code:
1
2
3
4
5 1 -> x 1 =: x; 1 = x; MOVE #1 x (ASM68k)
Faut pas 'croire que'. Faut lire la doc...Citation:
Envoyé par olivier1209
Mot savant pour 'variable locale'...Citation:
Envoyé par olivier1209
Bonjour,
C'est justement à l'occasion d'exercices qu'il faut prendre l'habitude de traiter les problèmes à fond, sinon on a tendance à dire "ceci est un cas extrèmement rare, inutile de prendre la peine de le traiter", sans parler des analyses incomplètes, pour la même raison (je sais bien qu'une analyse véritablement complète n'existe pas toujours, mais souvent elle existe, et n'est pas faite par laxisme et/ou incompétence et/ou manque de rigueur [pléonasme, ça fait partie des incompétences]).Citation:
Envoyé par olivier1209
Ne rigole pas, c'est tellement fréquent dans nombre de programmes, y compris des gros logiciels commerciaux.
Ce que j'ai précisé correspond aux règles habituelles des palindromes, il faut donc le prendre en compte, et ce n'est pas difficile à greffer sur le noyau déjà écrit.
Si on n'avait pas ça, comment ferais-tu un classement alphabétique ?Citation:
Envoyé par olivier1209
Avec une vraie fonction de classement alphabétique plutôt qu'une fonction qui classe sur le code des caractères (chiffre < majuscule < minuscule < accents)...Citation:
Envoyé par thewho
Malheureusement, le standard C n'en propose pas.
Avec une combinaison de tolower() et strcmp(), il est facile d'implanter une telle fonction de manière portable. Reste encore le problèmes des accents...Citation:
Envoyé par Médinoc
Thierry
Bonjour,
Évidemment, mais il faut bien comparer les chaines à un moment donné, et à moins de réécrire la fonction de comparaison...Citation:
Envoyé par Médinoc
Comment le C standard pourrait-il proposer ça, le traitement dépendant du codage utilisé.
Ben oui, il faut tout ramener à un standard de présentation.Citation:
Envoyé par mujigka
Le petit exercice pour les palindromes oblige à faire cela, pour ce qui est des parties supprimer les accents, tout passer en minuscules (ou majuscules).
Comme beaucoup (je suppose !), je me suis fait une petite bibliothèque qui prend tout cela en compte.
Mes données provenant à 99.9% (au moins :lol:) de bases de données, j'évite le problème de conversion trop fréquente de chaine d'origine vers chaine servant au classement, en stockant les 2 versions dans la base.
(Pas de problème de taille de la base, jusqu'ici, je n'ai jamais dépassé 1 GB)
Désolé pour le clavier ;) ... Je savais que j'aller me faire engueuler :oops: ...Citation:
Envoyé par Emmanuel Delahaye
j'ai essayé de le refaire en enlevant les variables globales, donc en entrant en parametre de chaque fonction les adresses des chaines de caractères. :yaisse2:
J'ai quand même un problème à l'exécution ... :traine:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 #include <stdio.h> #include <stdlib.h> #include <string.h> // chaine de caractere sur lesquelles on travaille => variable globale int compression (char *sz1[50],char *sz2[50]) // compresse une chaine de caractere { int i,j,n=0;j=0; for (i=0;*sz1[i]!=0;i++) n++; for (i=0;i<n;i++) if (*sz1[i]!=' ') { *sz2[j]=*sz1[i]; j++; } strcpy(*sz1,*sz2); printf("apres compression : %s\n",*sz2); return 0; } int inversion (char *sz1[50],char *sz2[50]) // inverse les caractères d'une chaine : abc=>cba { char c; int i,j,n; n=0; j=1; for (i=0;*sz2[i]!=0;i++) n++; for(i=0;i<n/2;i++) { c=*sz2[i]; *sz2[i]=*sz2[n-j]; *sz2[n-j]=c; j++; } printf("apres inversion : %s\n\n",*sz2); return 0; } int test_palindrome (char *sz1[50],char *sz2[50]) { return (strcmp(*sz1,*sz2)); } int main(int argc, char *argv[]) { char sz1[50], sz2[50]; fgets(sz1,sizeof(sz1),stdin); compression(&sz1,&sz2); inversion(&sz1,&sz2); if (!(test_palindrome(&sz1,&sz2))) puts("c'est un palindrome"); else puts("ce n'est pas un palindrome"); system("PAUSE"); return 0; }
Bonjour,
L'idée est bonne, et relève d'une bonne conception.Citation:
Envoyé par olivier1209
MAIS regarde bien comment tu as défini tes paramètres, c'est un joli bug.
Citation:
Envoyé par thewho
Merci 8-)
Bah je prend les adresses de mes chaines en parametres ... je pensais que c'était la coutume :aie:Citation:
Envoyé par thewho
merde strcpy a peut etre un problème ... je regarde ....