Remplacer un caractére par un autre en c

[Résolu/Fermé]
Signaler
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008
-
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008
-
Bonjour,
bon je chherche a écrire un programme en c qui a comme but de recevoir une chaine de caractére ,et le remplacer par un autre selon la demande de l'utilisateur de mon programme
voici mon code:
je cherche depuis l'erreur mais bon je n'y arrive tjs pas a retrv le bléme
#include <stdio.h>
#include <stdlib.h>

int main()
{
char ch[4555];
char n,k;
int i,nbc;
printf("entrer votre chaine de caractére\n");
fgets(ch,4555,stdin);
printf("entrer le caractére que vous souhaitez remplacer:\n");
scanf("%c",&n);
printf("entrer le nouveau caractére:\n");
scanf("%c",&k);
nbc=strlen(ch);

for(i=0;i<=nbc;i++)
if(ch[i]==n);
{ch[i]==k;}
getch();
}
merci.

3 réponses

Messages postés
793
Date d'inscription
vendredi 20 octobre 2006
Statut
Contributeur
Dernière intervention
4 septembre 2011
159
Salut,

Essaye ça :
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

int main() 
{ 
	char ch[4555]; 
	char n,k; 
	int i,nbc;
	
	printf("entrer votre chaine de caractére\n"); 
	fgets(ch,4555,stdin); 

	printf("entrer le caractére que vous souhaitez remplacer:\n"); 
	scanf("%c",&n); 

	printf("entrer le nouveau caractére:\n"); 
	scanf("%c",&k); 
	scanf("%c",&k);
	// J'ai mis une double affectation pour supprimer le \n qui se trouve à la fin du tampon du premier scan
	// Je n'ai rien trouvé de plus jolie

	nbc=strlen(ch);
	
	for(i=0;i<nbc;i++)
	{
		if( ch[i] == n ) ch[i]=k;
		
		printf("%c",ch[i]);
	}
}


@Bientôt
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
123
Bonjour,

Je sens que tu vas t'en vouloir :)

J'ai copié-collé le code dans mon éditeur et lancé la mise en forme automatique et blouf, elle a sauté aux yeux.
int main()
{
	char ch[4555];
	char n,k;
	int i,nbc;
	printf("entrer votre chaine de caractére\n");
	fgets(ch,4555,stdin);
	printf("entrer le caractére que vous souhaitez remplacer:\n");
	scanf("%c",&n);
	printf("entrer le nouveau caractére:\n");
	scanf("%c",&k);
	nbc=strlen(ch);

	for(i=0;i<=nbc;i++)
		if(ch[i]==n);
	{ch[i]==k;}
	getchar();
} 


D'ailleurs elle a une copine tout près d'elle. Deux étourderies en deux lignes, ça sent l'amour ça !


Une fois ceci corrigé il restera un petit problème supplémentaire.

stdin est une sorte de file d'attente dans lequel viennent s'ajouter les caractères tapés par l'utilisateur.
Le fgets fait proprement son travail, le premier scanf s'en tire bien sauf que... l'utilisateur tape une lettre puis Entrée.
Le scanf lit la lettre et le scanf suivant lit le 'Entrée' comme caractère. Ce qui est plutôt moyen.
Avant le 2ème scanf il faudra alors vider les caractères qui restent dans la file d'attente. (en les lisant)

En attendant le programme marchera si l'utilisateur rentre les deux caractères d'un coup à la première saisie par un scanf car le deuxième scanf lira le deuxième caractère de la ligne et non plus le Entrée..

M.
Messages postés
793
Date d'inscription
vendredi 20 octobre 2006
Statut
Contributeur
Dernière intervention
4 septembre 2011
159
Ou faire une double affectation pour vide le bluffer ... comme dit au poste n°1 .. :D

@plus
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
123 >
Messages postés
793
Date d'inscription
vendredi 20 octobre 2006
Statut
Contributeur
Dernière intervention
4 septembre 2011

La double lecture est plutôt... moyenne. Ne serait-ce que si l'utilisateur tape n'importe quoi, le programme fera n'importe quoi alors qu'il suffit de vider complètement le buffer pour que ça marche définitivement.

M.
Messages postés
793
Date d'inscription
vendredi 20 octobre 2006
Statut
Contributeur
Dernière intervention
4 septembre 2011
159
Justement, il existe une fonction pour le vider ?

[Edito] : je viens de la trouver .... ça serait pas mal de mieux chercher avant ... :
fflush(stdin);


A mettre naturellement entre les deux scanf
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008
>
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010

désolée je viens de le faire mais le probléme maintenant c'est que mon programme ne remplace pas le caractére voulu ,il fait rien du tt ,il m'affiche le texte tel qu'il est est ce qu'il ya un probléme au nivae de la boucle bon voici mon code
#include <stdio.h>
#include <stdlib.h>

int main()
{
char ch[4555];
char n,k;
int i,nbc;
printf("entrer votre chaine de caractére\n");
fgets(ch,4555,stdin);

printf("entrer le caractére que vous souhaitez remplacer:\n");
fflush(stdin);
scanf("%c",&n);
printf("entrer le nouveau caractére:\n");
fflush(stdin);
scanf("%c",&k);


printf("%c\n",k);
printf("%c\n",n);

nbc=strlen(ch);

for(i=0;i<=nbc;i++)
if(ch[i]==n);
{ch[i]==k;
printf("%s",ch);
}
getch();
}
merci mahmah c'est gentil.
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
123 >
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008

C'est les deux erreurs que je suggérais au début

for(i=0;i<=nbc;i++)
   if(ch[i]==n); // le point virgule est la plus courte instruction en C.
{
   ch[i]==k;     // == ou =
   printf("%s",ch);
}


M.

PS:

Je parlais de ça: Vider le buffer clavier.
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008
>
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010

lol
je comprends pas grands chose la ;je suis encore debutante en c et y a pas mal de chose que j connais pas encore
donc j sais pas ou se manifeste l'erreur exactement pour le fait de vider le clavier j'ai ajouté la fonction avant chaque scanf dc je vois pas ou est le prob?!!
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
123 >
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008

for(i=0;i<=nbc;i++)
   if(ch[i]==n)
      ;

{
   ch[i]==k;
   printf("%s",ch);
}


Le point virgule est compris comme l'instruction à exécuter si le test est vrai. Ce qui est plutôt gênant.
ch[i]==k; est une comparaison et en tant que telle sur une ligne ça ne fait rien. (Un bon compilateur te l'aurait dit)
L'affectation est "ch[i] = k;"

le fflush( stdin ); est très déconseillé, comme je le disais il n'est en rien standard et son comportement peut varier d'un compilateur à l'autre. Il n'est sensé recevoir que des flux sortant comme stdout en paramètre. Il sert à forcer l'écriture dans un fichier ou dans stdout. Il permet simplement de s'assurer que les données sont belles et bien écrites et non plus dans un tampon temporaire.
Avec stdin, au mieux ça marche, sinon ça ne fait rien, au pire ça crash. En bref c'est non défini avec un flux entrant.

M.
Messages postés
24
Date d'inscription
mercredi 26 mars 2008
Statut
Membre
Dernière intervention
26 juillet 2008
>
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010

oufffff merci mahmah ca marche mnt enfin chui soulagée merci a vous tous.