IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

probleme de reconnaissance de l'espace dans une chaine de caractéres


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut probleme de reconnaissance de l'espace dans une chaine de caractéres
    bonjour à tous,

    voilà mon probléme, je dois faire un petit programme en c afin de reconnaitre combien de caracteres l'utilisateur rentre dans sa chaine. Le truc tout simple sans strlen. Donc jusque la aucun probleme, sauf que j'ai voulu faire un petit programme qui savait reconnaitre d'autre caractere (genre l'apostrophe). Et la survient le hic, car impossible de reconnaitre l'espace.
    Je passe par une boucle en for avec un compteur afin de relire la chaine et de comptabiliser le nombre de caracteres, avec les condition de l'apostrophe dans un if et l'espace dans un else if. Tout marche tres bien sauf que des qu'il arrive a un espace dans la chaine de caractere, il arrete de comptabiliser et sort de la boucle. La, j'avou que je peine. C'est sans doute tres simple pour la plupart d'entre vous, mais j'admets que j'aimerai qu'on m'explique comment pallier à se probleme de l'espace. Je remercie par avance celui ou ceux qui voudront bien me dépatouiller.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    dans l'absolu on ne peut rien dire..

    Poste le code qui fait défaut stp...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    en te remerciant par avance souviron34
    voici mon code.
    sois indulgent, je débute


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include<stdlib.h>
    #include<stdio.h>
     
     
    int main()
    {
    	char tab[100]={0};//declaration et initialisation du tableau de type char
    	int i=0,cpt=0;//declaration et initialisation d'un indice et d'un compteur
     
    	printf ("\t\t************************************************************\n");			/*******************************/
    	printf ("\t\t********* Affichage de la longueur d'une chaine ************\n");			/*********presentation*********/
    	printf ("\t\t*********          sans la fonction strlen      ************\n");			/*****************************/
    	printf ("\t\t************************************************************\n\n\n");		/****************************/
    	printf ("Veuillez rentrer une chaine de caracteres : \n\n");//appel a l'utilisateur
    	scanf ("%s",&tab);//sauvegarde de la chaine dans le tableau
     
    	for (i,cpt;i<tab[i];i++)//boucle pour relire le tableau
    	{
    		if (tab[i]='39')
    		{
    		cpt++;//incrementation de 1 au compteur
    		}
    		else if (tab[i]='32')
    		{
    			cpt++;
    		}
    		else
    			cpt++;
    	}
    	printf ("\nla chaine possede %d caracteres.\n",cpt);//restitution du nombre de caractere par le compteur cpt
     
    	return 0;
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    je ne demande pas une solution, juste un aiguillage.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    c'est parce que tu as fait un scanf("%s", qui s'arrête à l'espace

    De toutes façons scanf est déconseillée ..

    Utilise (si tu as le droit) fgets(buf, taille, stdin)

    Ensuite il est peu recommandé de faire varier plusieurs varaibles différentes dans le lancement d'une boucle

    Enfin le test sur la fin d'une chaine est normalement caractère = '\0'

    Remarque :

    tu devrait utiliser la balise CODE (le signe # au dessus du message)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    je te remerci de m'avoir accordé du temps et je tiens a souligner que je suis impressionner qu'il y a des gens comme toi pour une aide aussi rapide. maintenant, je vais tenter de resoudre mon probleme.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    en plus une erreur que je n'avais pas remarqué quand c'était en texte simple :

    la comparaison en C s'écrit avec == et non avec = (= est une assignation)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    remplacer le == '39' par == ' ' ou == 39 sans a les apostrophes (si le code ascii 39 correspond a l espace)
    "vaste programme"

  9. #9
    Membre régulier Avatar de siegfried64
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 98
    Points
    98
    Par défaut
    encore un erreur :

    tab est un pointeur, correction :

    Apart ca je comprend pas l'intérêt de ce passage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		if (tab[i]='39')
    		{
    		cpt++;//incrementation de 1 au compteur
    		}
    		else if (tab[i]='32')
    		{
    			cpt++;
    		}
    		else
    			cpt++;
    comme vous pouvez le remarquer cpt sera incrementer a chaque passage du boucle. donc ce passage pourra etre remplacé par :

    et je doute de loin que ca soit ca ce que vous vouliez faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i,cpt;i<tab[i];i++)//boucle pour relire le tableau
    i<tab[i] , la tu compare i avec un char, donc avec son code ascii, ce qui causera un violation d'accès mémoire, et votre programme sera fermé.
    Pour obtenir des réponses, rien n’est plus naturel que de poser des questions.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    tout d'abord, merci a tous pour votre aide. J'ai pu faire un code plus simple avec fgets et je remercie souviron pour cet aiguillage.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include<stdlib.h>
    #include<stdio.h>
     
     
    int main()
    {
    	char tab[100]={0};//declaration et initialisation du tableau de type char
    	int i=0,cpt=0;//declaration et initialisation d'un indice et d'un compteur
     
    	printf ("\t\t************************************************************\n");			/*******************************/
    	printf ("\t\t********* Affichage de la longueur d'une chaine ************\n");			/*********presentation*********/
    	printf ("\t\t*********          sans la fonction strlen      ************\n");			/*****************************/
    	printf ("\t\t************************************************************\n\n\n");		/****************************/
    	printf ("Veuillez rentrer une chaine de caracteres : \n\n");//appel a l'utilisateur
    	fgets(tab, 100, stdin);
     
     
     
    	for (i,cpt;i<tab[i];i++)//boucle pour relire le tableau
    	{
     
    			cpt++;
    	}
     
    	printf ("\nla chaine possede %d caracteres.\n",cpt);//restitution du nombre de caractere par le compteur cpt
     
    	return 0;
    }
    et pour repondre a siegfried64, je fais une formation a distance a l'age de 30ans et mon milieu est loin d'etre l'informatique donc je ne connais pas toutes les ressources a utiliser, donc si j'ai encombré le forum inutilement, je tiens a m'en excuser. Par contre le but de mon devoir est d'ecrire un prgmpermettant d'entrer une chaine de caracteres et d'en afficher sa longueur sans strlen, voila.Mais j'aime me compliquer la vie et ne manipulant que scanf ("%s") pour une chaine de caractere je n'ai pas pensé a fgets.le but de l'exercice est de m'acheminer vers les manipulations de chaine afin de reconnaitre un palindrome.Pour ce qui est des erreurs commises dans mon premier programme, je debute, donc j'en fait, mais elles me servent de lecons.

    ps:c'est en forgeant qu'on devient forgeron.

    ps2:encore merci a vous 3

  11. #11
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Par contre le but de mon devoir est d'ecrire un prgmpermettant d'entrer une chaine de caracteres et d'en afficher sa longueur sans strlen, voila
    Dans ce cas, il faut savoir que la chaîne de caractères en C est terminée par la valeur 0 ( ou '\0' ce qui est la même chose mais est différent de '0'). La condition d'arrêt du comptage est donc d'arriver à ce que tab[i] soit égal à 0.
    On obtient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i=0;tab[i]!= 0;i++){}
    printf ("\nla chaine possede %d caracteres.\n",i);
    Ceci ne compte pas le 0 terminal (comme strlen d'ailleurs)

    Continue à forger
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bono7 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	for (i,cpt;i<tab[i];i++)//boucle pour relire le tableau
    	{
    		
    			cpt++;
    	}
    Attention ! On ne peut pas comparer "i" (un indice) avec "tab[i]" (un élément indicé d'un tableau).
    Par ailleurs il est plus courant d'initialiser les éléments dans le "for()" même si ces éléments ont été initialisés ailleurs. Si un jour le programme est modifié et que l'initialisation saute, le "for()" continue à marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=<valeur>, cpt=<valeur; test sur "i" (ou sur un élément référencé par "i"); évolution de "i", évolution de "cpt");
    Citation Envoyé par bono7 Voir le message
    ...le but de l'exercice est de m'acheminer vers les manipulations de chaine afin de reconnaitre un palindrome...
    Tu considères qu'elle est palindrome d'office puis tu vérifies si elle ne l'est pas (plus facile de vérifier si un élément ne répond pas au critère plutôt que tous les éléments qui y répondent). Un indice placé au début,un autre sur la fin. Tu montes le premier et tu descends le second tant que les caractères sont identiques et tant que les indices ne se sont pas croisés.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    merci pour ces conseils Sve@r, je vais me plancher sur l'algorithme car j'ai quelques regles imposées avant d'en arriver a deduire si c'est un palindrome ou pas.Par contre il est vrai que l'erreur de comparer un indice avec tab[i] est evidente maintenant que vous me le faites tous remarquer.S'en est meme logique.A moi de retourner me forger

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Caractère espace dans une chaine de caractère
    Par 8itit dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 20/04/2010, 14h09
  2. [MySQL] Espace dans une chaine de caractère
    Par jeremy2011 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/04/2010, 08h34
  3. calculer le nombre d'espaces dans une chaine de caractère
    Par tang le breton dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/06/2009, 10h45
  4. Affichage d'espaces dans une chaine de caractères
    Par MistyMan dans le forum Langage
    Réponses: 4
    Dernier message: 15/02/2009, 13h27
  5. Supprimer les espaces dans une chaine de caractères
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 23/07/2007, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo