Programmation en C - Suppression de caractère - C - Programmation
Marsh Posté le 20-03-2005 à 15:16:05
Salut,
Sa fait longtemps que j'ai pas touché au C mais:
ce que tu peux peut etre faire c'est :
Code :
|
Marsh Posté le 20-03-2005 à 15:19:03
pourquoi aller jusque \n et pas jusque la fin de la chaine ??
Marsh Posté le 20-03-2005 à 15:39:27
Humpf, ça ne marche toujours pas.
A chaque fois, ça ne me teste que le premier mot.
Peut-être que le problème vient d'autre part. Voilà ce que j'ai fait :
#include<stdio.h>
#include<string.h>
int palindrome(char S[80])
{
int i, j, L, test;
char M[80], sans_espace[80];
L=strlen (S);
i=0;
j=0;
while(i<L)
{
if(S[i]!= ' ')
{
sans_espace[j] = S[i];
j++;
}
i++;
}
S[80]=sans_espace[80];
L=strlen (S);
for (j=0; j<L; j++)
{
for (i=L-1; i>=0; i--)
M[j]=S[i];
}
test=0;
for (i=0; i<L; i++)
if (M[i]!=S[i])
test=0;
else
test=1;
return test;
}
int main (void)
{
char mot[80], rep;
int a;
do
{
printf ("Entrez le mot \n" );
scanf ("%s", &mot);
a=palindrome (mot);
if (a==1)
printf ("%s est un palindrome \n", mot);
if (a==0)
printf ("%s n'est pas un palindrome \n", mot);
printf ("Continuer ? o/n \n" );
do
{
rep=getchar();
}
while ((rep!='o')&&(rep!='n'));
}
while (rep=='o');
return 0;
}
M'ci
Marsh Posté le 20-03-2005 à 16:16:56
Ton problème vient du scanf.
Pour commencer, en C, un tableau est automatiquement converti en une valeur de type pointeur lorsqu'il est utilisé dans une expression. Le & est donc inutile (mais n'a pas d'effet, la valeur du pointeur restant identique -- mais j'ignore si ce comportement dépend de l'implémentation).
Plus important, scanf tel que tu l'utilises ne lit qu'un mot, ce qui n'est pas ce que tu veux.
Et encore plus important, il ne faut pas utiliser scanf pour récupérer une chaine de caractère entrée par l'utilisateur : imagine qu'il tape une chaine de caractère de plus de 80 caractères! Le mieux est d'utiliser fgets (n'oublie pas d'enlever le '\n' final).
Dernière remarque, les valeurs telles que ton 80 partout dans le code sont à proscrires (imagine ce qu'il se passe si tu veux changer cette valeur dans un fichier de plusieurs milleirs de lignes ). Utilise plutôt un #define et des sizeof
Marsh Posté le 20-03-2005 à 16:23:47
Bon, j'ai compris.
Mais, est-ce que tu pourrais me dire comment utiliser le fgets ? Je le met où ?
(Puis, pour le 80, hem, j'suis la seule à utiliser mon programme (ui bon, c'est vrai que...))
(Re)M'ci
Marsh Posté le 20-03-2005 à 16:40:13
Emmylou a écrit : Humpf, ça ne marche toujours pas. |
Analyse de ton code :
|
Marsh Posté le 20-03-2005 à 16:43:31
Emmylou a écrit : Mais, est-ce que tu pourrais me dire comment utiliser le fgets ? Je le met où ? |
http://mapage.noos.fr/emdel/notes.htm#saisie
A la place du scanf().
Marsh Posté le 20-03-2005 à 21:00:28
Emmanuel> pourrais-tu donner un lien, ou un début d'explication, sur l'utilisation en *mode expert* de scanf ?
Marsh Posté le 20-03-2005 à 21:29:08
++fab a écrit : Emmanuel> pourrais-tu donner un lien, ou un début d'explication, sur l'utilisation en *mode expert* de scanf ? |
Franchement, je n'en ai pas. Je connais (via le forum Usenet comp.lang.c) un gourou qui est spécialiste de la chose, c'est Dan Pop :
Dan.Pop@cern.ch
danpop@mail.cern.ch
danpop@cernapo.cern.ch
danpop@afsmail.cern.ch
Si tu veux lui demander de monter un site, bon courage.
Marsh Posté le 21-03-2005 à 05:52:18
scanf pas bien.
scanf() == read() + aquisition vsnprintf() == lenteur + bufferization de ******
Vous devriez franchement vous mettre un minimun au parsing. Tout les gars que je vois sur ce forum utilise ce genre de fonction.
En plus dans :
Code :
|
Ya encore un buffer overflow possible #!@.
Vous n'allez pas me dire que c'est dure de faire :
Code :
|
Et arretez (notamment Emmanuel D elahay) de dire que read/write etc ne sont pas standard.
A la limite vraiment c'est mieux d'utilisé fgets() mais bon.... il y a toujour une histoire de bufferization. Alors que read()/write() sont des appele systemes.
Marsh Posté le 21-03-2005 à 08:40:26
plofplof a écrit :
|
Désolé, mais je ne suis pas près d'arréter! D'ailleurs, ce que je dis, c'est une évidence, c'est à dire qu'elles ne font pas partie de la norme qui définit le langage C.
Pas de 'read()' sur ma plateforme AMX/MRI pour 68000 (Embarqué). Pas ça non plus sous Mac (non OS/X) à ma connaissance.
Citation : |
La bufferisation est un avantage reconnu en matière de performance (par la réduction du nombre d'appels systèmes, notamment). Autre avantage de fgets(), c'est une fonction standard du langage C assez simple à utiliser et robuste.
Désolé d'insister, mais les fonctions systèmes read() / write() etc. sont des fonctions, certes au standard POSIX.1, mais qui ne font pas partie du langage C.
Que je sache, rien n'oblige une plateforme à supporter POSIX.1. Ces fonctions ne sont donc pas portables.
Marsh Posté le 21-03-2005 à 17:03:35
Hello,
Citation : |
P-e pour ton AMX pas pour mac os.
descript-mac:~ root# uname -a
Darwin descript-mac.local 7.6.0 Darwin Kernel Version 7.6.0: Sun Oct 10 12:05:27 PDT 2004; root:xnu/xnu-517.9.4.obj~1/RELEASE_PPC Power Macintosh powerpc
Citation : |
Un avantage reconnu ? P-e pas quand meme non plus .
Le gros probleme est la mauvaise syncronisation d'ecriture du message quand tu utilise des thread. Ou aussi quand tu utilise ton propre algo d'allocation.
Les fonctions read() / write() utilise des appels systeme linux. 0x3 pour read() et 0x4 pour write(). Un syscall (appele-systeme) est appeler par une interruption (0x80 pour linux).
Par exemple exit() est aussi un syscall :
Code :
|
A savoir que la lecture / ecriture par des syscall permet (aussi) de s'aligner sur la vitesse de scheduling du kernel (select() / poll() / epoll() / kqueue()).
read() & write() ne bufferize pas.
Très franchement c'est meme pas la pene d'essayer de comparer fgets() / fread() par rapport read() en terme de performance.
++
Marsh Posté le 21-03-2005 à 17:36:19
Citation : Un avantage reconnu ? P-e pas quand meme non plus . |
read(), write(), c'est pas du C .|
Marsh Posté le 21-03-2005 à 18:14:10
c'est pas du C ANSI
mais UNIX et Win 32.
allé j'ai pas pu m'empêcher...
Code :
|
Marsh Posté le 21-03-2005 à 20:17:16
dommage, t'as oublié tout les const
bon, ça passe en C99 uniquement ton truc.
Marsh Posté le 21-03-2005 à 20:35:19
++fab a écrit : dommage, t'as oublié tout les const |
C90 un peu remanié avec test unitaire :
|
Marsh Posté le 22-03-2005 à 06:03:08
Les zami
C'est en C++ qu'on met char const *plof.
En C c'est const char *.
Et son truc passera sur du C89, C90 et C99.
Code :
|
j'suis pas dakor meme si ca marche.
Code :
|
puis merde c vraiment un truc que de mesure de nivo ici.
Marsh Posté le 22-03-2005 à 08:06:50
ReplyMarsh Posté le 22-03-2005 à 08:39:55
plofplof a écrit : |
??? Je ne connais pas le C++, mais en C, c'est comme on veut.
|
Citation : Et son truc passera sur du C89, C90 et C99. |
Quel truc ? Tes commentaires sont assez ésotériques, c'est normal ?
En tout cas, ça
for(char *debut=phrase,*fin=debut+n-1;debut<=fin;debut++,fin--) |
c'est du C99.
Citation :
|
Tu n'est pas d'accord avec quoi (à part l'orthographe) ? Quels sont tes arguments ? En matière technique, je ne me contente pas d'impressions...
Citation :
|
Etant donné que j'ai modifié le paramètre 'phrase' en 'char const *phrase', les pointeurs sur cet objet doivent aussi être 'const'. C'est logique, et si tu ne le fais pas, ton compilateur se chargera de te le rappeler.
Citation : puis merde c vraiment un truc que de mesure de nivo ici. |
Quel est le sens exact de cette remarque ?
Marsh Posté le 22-03-2005 à 09:21:06
Citation : C'est en C++ qu'on met char const *plof. |
pour ton information, le const s'applique toujours à ce qui est placé immédiatement avant lui.
Sauf lorsqu'il n'y a rien avant : dans ce cas la, il s'applique à ce qu'il y a immédiatement après.
En C++, c'est exactement la même règle.
Citation : j'suis pas dakor meme si ca marche. |
t'es pas kador non plus
Marsh Posté le 20-03-2005 à 14:41:52
Bonjour,
je suis en 1e année de licence maths-info et j'ai un petit problème avec un programme que je dois faire pour mon cours de programmation. (Hem, j'ai des cours de programmation en C depuis la fin du mois de janvier, je suis donc une débutante )
Le but du programme est de dire si un mot est un palindrome ou pas. (Un palindrome étant un mot ou une phrase que l'on peut lire de droit à gauche et de gauche à droite, comme 'ici')
Ce qui me pose problème c'est de supprimer les caractères espace dans la chaine de caractère que je veux tester.
Je m'exlique :
Je dois faire une fonction 'palindrome' qui a pour argument une chaine de caractère S et qui supprime les éventuels caractères 'espace' de la chaîne S (par exemple 'elu par cette crapule' est un palindrome, faut enlever les espaces...) et retourne ensuite la valeur 1 si S est un palindorme et 0 si ce n'est pas un palindrome.
Pour le palindrome en lui même, je n'ai pas de problème, c'est la suppression des espaces qui me pose un problème. J'ai tenté plusieurs choses, mais chaque fois ça me supprime ce qu'il y a après le 1e espace...
Si jamais vous pouviez m'aider
Merci
Emmylou