Bonjour je cherche un moyen de crée une fonction qui supprime un caractère dans une chaine de caractère en paramètre.
voici mon code :
void del (char mot[], char c);
int main()
{
char mot[1000] = "eddy";
char c = 'y';
printf("%s", del(mot, c));
return 0;
}
void del (char mot[], char c)
{
int i = 0;
for (i = 0; mot[i] != '\0'; i++)
{
if (mot[i]==c)
{
c =""; // Je ne sais pas trop quelle instruction mettre pour que le caractère soit supp de la chaine
}
}
}
Bonsoir, je ne pense pas que tu peut faire ça avec un tableau constant tu va avoir besoin d'un tableau dynamique et si tu n'a pas envie de t'embêter avec une fonction utilisé une liste chainée mais les listes chainée son un peu compliqué à utiliser si tu est débutant.
Indication : le caractère peut apparaître plusieurs fois dans la chaîne.
Décaler d'une position quand on en trouve un n'est pas une bonne solution.
(algorithme quadratique au lieu de linéaire, il y avait un bug de ce type bien connu dans le code du serveur web apache, dans le nettoyage des url pour éliminer les "../".)
- Edité par michelbillaud 16 janvier 2020 à 6:45:34
(algorithme quadratique au lieu de linéaire, il y avait un bug de ce type bien connu dans le code du serveur web apache, dans le nettoyage des url pour éliminer les "../".)
- Edité par michelbillaud il y a environ 1 heure
En effet, décaler a un cout. Ce qui peut être fait, c'est séparer un algorithme de suppresion, qui va remplacer les caractères à supprimer par un caractère spécial, et une fois qu'on a fini toutes les suppressions, procéder à un seul décalage, avec un curseur d'écriture toujours inférieur ou égal à celui de lecture.
qui nécessitent l'achat d'une boite d'aspirine (on copie d'abord le caractère, puis on regarde si il faut le conserver ou pas dans la chaine destination. Ce qui fait que le NUL à été copié).
Et pour éliminer sans copier, on confond source et destination.
- Edité par michelbillaud 17 janvier 2020 à 8:47:15
REEEE tout le monde j'ai trouvé un truc qui fonctionne à peu près !!!!
#include <stdio.h>
#include <stdlib.h>
void del (char mot[], char c);
int main()
{
char mot[1000] = "eddy";
char c = 'y';
del(mot, c);
printf("%s", mot);
return 0;
}
void del (char mot[], char c)
{
int i = 0;
for (i = 0; mot[i] != '\0'; i++)
{
if (mot[i]==c)
{
c="";
mot[i] = c; // Je ne sais pas trop quelle instruction mettre pour que le caractère soit supp de la chaine
}
}
}
Si c'est pour trouver qu'en enlevant la dernière lettre de "eddy" on trouve "edd", il n'y avait pas besoin d'ecrire un programme.
Un programme, ça doit marcher dans tous les cas.
Essaie d'enlever le 'd', pour voir.
Tester, ça ne prouve JAMAIS que ça marche, parce qu'on ne peut pas essayer tous les cas. Par contre, si on propose des cas de test divers et variés, on a plus de chances de remarquer que ça ne marche pas.
Ton test c'était un cas très particulier : une seule occurrence, qui se trouve à la fin. Faut être un peu sérieux, quand on fait les tests.
- Edité par michelbillaud 17 janvier 2020 à 8:03:32
Ca fonctionne. C'est le résultat que je voulais donc ça fonctionne.
----
Bon, regardons calmement.
1. Déjà quand on compile la fonction del, le compilateur couine
gcc -Wall -o "del." "del..c" (dans le dossier : /mnt/roost/users/mibillau) del..c: In function ‘del’: del..c:23:14: warning: assignment makes integer from pointer without a cast [-Wint-conversion] c=""; ^
C'est très mauvais signe. Pour les débutants qui font des choses pas trop sportives normalement, c'est révélateur d'un bug.
Ici : ça demande de mettre l'adresse de la chaine vide dans un char (qui est assimilé à un entier, merci les inventeurs de C).
2. Si on fait tourner, et qu'on se décide à ouvrir les yeux (désolé pour Pierrot, capture d'écran), on risque de voir quelque chose comme ça (ça va dépendre du système, du jeu de caractères etc).
En clair, ça a collé une merde à la place du y. C'est pas ce que j'appellerais "marcher"
3. Avec char mot[1000] = "eddddddy"; char c = 'd';
C'est joli aussi
et on voit que seul le premier 'd' a été traité.
@pierrot, historiquement, c'est Turing qui s'est rendu compte qu'on ne pouvait pas tester tous les cas. De mémoire, dans son labo de Manchester, il voulait vérifier qu'un circuit matériel (multiplicateur ?) fonctionnait correctement (même résultat qu'un programme). Il a évalué le nombre de cas à essayer, le temps nécessaire, et il s'est dit qu'il fallait faire autrement si on voulait prouver des trucs. D'où papier "checking a large routine" en 1949.
Ce qui donnera la méthode dite "des assertions" de Floyd, Hoare etc. et les techniques de vérification, formelle automatique ou pas, des programmes (et des circuits pour nos amis électroniciens digitaux).
- Edité par michelbillaud 17 janvier 2020 à 17:51:28
if((nbr & 1) ==0) return(false); // la plus rapide (mais on s'en fiche)
if((nbr % 2) == 0) return(false); // la plus orthodoxe
Quand je fais des tests, je commence par les cas faciles. Si ça ne marche déjà pas là, j'ai un sérieux problème.
Ensuite, j'essaie de trouver les cas "exotiques" ou "limites".
Le Tout est souvent plus grand que la somme de ses parties.
fonction qui supprime un caractère
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.