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 :

Découper une chaîne en fonction d'un nombre


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 41
    Points : 35
    Points
    35
    Par défaut Découper une chaîne en fonction d'un nombre
    Bonjour,
    ce que je voudrais est découper une chaîne de caractère en fonction d'un nombre.
    le nombre de caractère étant le maximum autoriser.
    par exemple :
    la chaîne :"salut je suis un chat blanc , qui mange des souris."
    le nombre : 20.
    une fois la découpe je dois avoir comme chaîne :
    "salut je suis un cha" , "t blanc , qui mange " , "des souris."

    j'utilise le code ci-dessous sauf que je n'est aucune valeur lorsque j'affiche la découpe.
    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
     
    void decoupe(char * chaine, int nb)
    {
    	int nombreDeCaracteres = 0;
        char caractereActuel = 0;
    	char * texte;
        do
        {
            caractereActuel = chaine[nombreDeCaracteres];
    		if (nombreDeCaracteres%nb ==0){
    		    printf("\n%s",texte);
    			texte = "";
     
    		} else {
    		strcat(texte,chaine[nombreDeCaracteres]);
    		}
     
            nombreDeCaracteres++;
        }
        while(caractereActuel != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0
    	printf("\n%s",texte);
    }
    est-ce que vous savez pourquoi ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Ton code devrait planter parce que tu passes à la fonction strcat une chaîne de caractères non allouée (et en plus de cela ton pointeur n'est pas initialisé).

    Et au passage, texte = ""; c'est n'importe quoi. La variable texte est un pointeur. Tu ne fais pas du C++.

    Et tu ne précises pas quel résultat veux-tu avoir ? parce que si on découpe une chaîne de caractères c'est pour en créer un certains nombres.

    Et donc en C, il faut 1) compter le nombre de morceaux 2) pour chaque morceau, allocation puis copie.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    1)
    tu passes à la fonction strcat une chaîne de caractères non allouée (et en plus de cela ton pointeur n'est pas initialisé).
    je ne comprend pas ce que tu m'explique.

    2)
    j'ai remplacer le par 3)
    Ce que je voudrais est que si j'ai une chaîne de plus de 20 caractère de long, elle soit affiché en X chaîne de 20 caractère de long. (X étant le nombre de chaîne créer suivant la longueur de ma chaîne d’orgie).

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Citation Envoyé par gtapes Voir le message
    je ne comprend pas ce que tu m'explique.
    Est-ce que tu connais malloc ? (<- lien cplusplus en anglais)


    Citation Envoyé par gtapes Voir le message
    elle soit affiché en X chaîne de 20 caractère de long
    Laisse moi deviner, et au prochain T.P., 20 sera une variable

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Pour ce qui est du malloc() , dans la documentation de l'environnement ou l'application doit être il m'est déconseiller d'utiliser cette fonction.
    Non le 20 ne changera jamais.
    l'application doit être installer sur une douchette dont la taille de l'écran ne peut prendre que 20 caractère maximum ( avec la taille de font que j'utilise).

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    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 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par gtapes Voir le message
    je ne comprend pas ce que tu m'explique.
    La notion de "chaine" en tant qu'entité manipulable n'existe pas en C. Toutefois on en a besoin. Les développeurs ont alors établi la convention qu'une chaine serait représentée par un tableau de caractères dont l'un de ces caractères vaut impérativement '\0'.
    Ainsi, en ayant le début du tableau et en sachant où s'arrêter (au '\0') on peut traiter (compter, copier, afficher, concaténer) le contenu du tableau comme si c'était une vraie chaine. Et si on ne peut pas distinguer à l'usage "ce qui ressemble à une chaine" d'une vraie chaine, alors c'est qu'on n'a pas besoin de les distinguer. Et donc ça se traduit par ce résumé qu'une chaine c'est un tableau contenant un '\0'.

    Si de ton côté tu utilises une fonction strXXX() destinée à manipuler un tableau de caractères sensé être vu comme une chaine, tu dois t'assurer que ce que tu lui passes est bien une chaine donc contient bien un '\0'. Tu peux t'en assurer de 2 façons
    1. si c'est toi qui crées le tableau => tu lui rajoutes impérativement un '\0' et tu veilles ensuite à ce qu'il ne soit jamais effacé
    2. si tu remplis le tableau via une fonction de création/remplissage de chaine (strcpy(), strcat(), fgets()). Tu es alors assuré que ces fonctions mettront toujours un '\0' en fin de remplissage (à l'exception de strncpy() qui ne met pas de '\0' si elle a copié n caractères => mais si on le sait ce n'est pas grave => suffit de le rajouter manuellement).


    Dans tous les cas, tu dois t'assurer que ton tableau aura assez d'espace de prévu pour stocker à la fois ta chaine (ce dont tu as besoin pour travailler) et à la fois le '\0'. Et ça, tu ne peux le faire là aussi que de 2 façons
    1. tu connais d'avance la taille maximale que peut avoir ta chaine => tu définis un tableau de cette taille + 1
    2. tu ne connais pas la taille mais tu peux la calculer "en direct" (et aussi avant d'avoir besoin de réellement stocker la chaine) grâce à un mécanisme quelconque => tu calcules donc cette taille nécessaire puis tu alloues de la mémoire pour pouvoir stocker et la chaine et le '\0' (d'où la remarque de foetus sur malloc)


    Tu peux même avoir plusieurs '\0' dans le tableau ce n'est pas grave. Toute fonction de traitement s'arrétant au premier '\0', ce qu'il y a après ne sera pas considéré (c'est d'ailleurs une des méthodes les plus usuelles pour tronquer une chaine => on place simplement un '\0' à l'endroit voulu). L'important c'est qu'il y en ait toujours un avant de faire traiter ce tableau par une fonction de traitement de chaine.

    Si en revanche tu passes à une fonction de traitement un tableau qui n'est pas garanti contenir de '\0', la fonction part du début du tableau et lit jusqu'à ce qu'elle trouve ce '\0' qui n'y est pas. Elle dépasse donc les limites du tableau et continue à balayer au delà jusqu'à ce qu'elle tombe enfin sur un octet valant '\0'. Fatalement il doit y en avoir dans la mémoire vu que tout octet possède une valeur comprise entre 0 et 255. Mais ayant dépassé la zone autorisée, ça produit un comportement indéterminé qui se traduit par un programme erratique (et foetus a (de façon tout à fait exceptionnellement rarissime) tort sur ce point car le comportement est vraiment indéterminé c.a.d. imprévisible => on ne peut même pas dire que ça plantera ou que ça devrait planter).

    De ton côté tu définis un pointeur char *texte que tu fais pointer vers une zone statique de ton code contenant une chaine (ici ""). Tu en as tout à fait le droit. Mais comme la zone est statique, tu ne peux pas la modifier. Donc ni écrire par exemple texte[0]='x' ni même demander à strcat() de la modifier pour toi (parce que faut pas te leurrer, ce que fait strcat(dest, source) c'est simplement balayer le tableau "source" caractère par caractère et le copier dans le tableau "dest" ; donc à un moment donné elle écrit fatalement dest[i]=source[i]).

    Citation Envoyé par gtapes Voir le message
    Ce que je voudrais est que si j'ai une chaîne de plus de 20 caractère de long, elle soit affiché en X chaîne de 20 caractère de long. (X étant le nombre de chaîne créer suivant la longueur de ma chaîne d’orgie).
    Chaine d'orgie. Romaine l'orgie ???
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void affiche(char *s) {
    	char tab[20 + 1];
    	tab[20]='\0';		// Application bête et con du principe "1" => je sais que mon tableau aura 20 caractères "utiles" (indicés de 0 à 19), je sais donc que l'indice "20" ne sera jamais modifié
    	unsigned short i;
    	unsigned short len=strlen(s);
    	for (i=0; i < len; i+=20) {
    		strncpy(tab, s+i, 20);		// Je sais que si strncpy() n'a pas atteint les 20 caractères copiés (typiquement pour le dernier bout de "s"), elle mettra un '\0' en fin de copie (donc avant tab[20]) et que ce '\0' sera vu avant le mien.
    		printf("%s\n", tab);
    	}
    }
    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]

  7. #7
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Salut ,
    nonobstant les remarques de Sve@r (qui est l'expert sur ce forum) je voudrais ajouter que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    else {
                strcat(texte,chaine[nombreDeCaracteres]);
            }
    ....
    ne fonctionne tout simplement pas car la fonction strcat(char*,char*) attend que tu fournisse 2 pointeurs sur
    des chaînes de caractère ; hors ,tu lui passe en deuxième argument un caractère
    ?! Bref ,si tu avais compilé ton code tu le saurais ...
    mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .....
    else {
                strcat(texte,chaine+nombreDeCaracteres);
            }
    .....
    qui ne résout pas tout puisque on assiste alors à un plantage du programme
    Un conseil : relis le post de Sve@r et tâches de bosser les fonctions de <string.h> !!

  8. #8
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    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
    #include <assert.h>
    #include <stdio.h>
     
     
    void print_justified(const char *s, int len) {
        assert(s);
        assert(len > 0);
     
        while (printf("%.*s\n", len, s) == len + 1 /* strlen("\n") */)
            s += len;
    }
     
     
    #define LINE_LEN 20
     
    int main(int argc, char *argv[]) {
        for (int i = 1; i < argc; ++i)
            print_justified(argv[i], LINE_LEN);
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ./a.out "salut je suis un chat blanc , qui mange des souris."
    salut je suis un cha
    t blanc , qui mange 
    des souris.
    $

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    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 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void print_justified(const char *s, int len) {
        while (printf("%.*s\n", len, s) == len + 1 /* strlen("\n") */)
            s += len;
    }
    Joli. Demander à printf() de tronquer son affichage sur 20 caractères et utiliser son retour (qui est en fait le nombre de caractères affichés) pour vérifier que tout a été affiché. Belle démonstration de concision

    Peut-être expliquer le principe eut été un plus
    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]

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Inutile, puisque tu viens de le faire d'une manière plus concise que je n'aurais pu le faire. Et puis hé, je me suis déjà fendu d'un commentaire pour le +1 !

    J'essaie en général de laisser un temps au lecteur pour se familiariser avec les notions évoquées, et chercher un peu seul. Je pars du principe - peut-être à côté de la plaque - que si l'OP nous accorde de l'intérêt, il reviendra demander des précisions, partager son expérience, etc..

  11. #11
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Bonjour,

    Je ne suis pas sûr que printf("\n"); retourne toujours 1. La fonction est censée retourner le nombre de caractères écris, et sur certains systèmes il y a deux caractères écris : un carriage-return et un line-feed.
    Si on part du principe que la chaîne ne contient pas elle-même de CR, j'écrirais par sécurité :
    while (printf("%.*s\n", len, s) >= len + 1 )

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Mon problème a était corriger par le message de Sve@r.
    voici le code Final pour ce que sa intéresse.

    nbsaut sert a savoir combien de saut (retour a la ligne) l’application a effectuer afin de pouvoir afficher la saisie de l'utilisateur au bon endroit.
    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
     
    int decoupe(char * chaine, int nb)
    {
     
    	int nbsaut=0;
    	char tab[nb + 1];
    	tab[nb]='\0';		
    	unsigned short i;
    	unsigned short len=strlen(chaine);
    	for (i=0; i < len; i+=nb) {
    		strncpy(tab, chaine+i, nb);		
    		printf("\n%s", tab);
    		nbsaut++;
    	}
    	return nbsaut;
    }

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Citation Envoyé par gtapes Voir le message
    voici le code Final pour ce que sa intéresse.
    Le seul hic, c'est qu'on ne peut pas créer de tableau statique avec un nombre variable

    Édit : Après vérification, c99 au minimum (gcc XXX -std=c89 -pedantic -Wall ougcc XXX -std=c90 -pedantic -Wall)
    De toute manière, il y a aussi l'initialisation de la variable nbsaut qui est trop tôt.

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    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 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gtapes Voir le message
    Pour ce qui est du malloc() , dans la documentation de l'environnement ou l'application doit être il m'est déconseiller d'utiliser cette fonction.
    Non le 20 ne changera jamais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int decoupe(char * chaine, int nb)
    Citation Envoyé par foetus Voir le message
    Le seul hic, c'est qu'on ne peut pas créer de tableau statique avec un nombre variable
    Si "nb" n'est pas destiné à changer, alors il n'a pas besoin d'être en paramètre. C'est bien évidemment un plus oui (mieux vaut en effet une fonction modulable qu'une fonction fixe) mais voilà, foetus a soulevé un point important auquel il me manque des connaissances pour pouvoir répondre. Il me semble que les VLA (ou alors au pire la solution de base malloc) peuvent gérer l'affaire mais comme tu parles d'un certain environnement spécifique...

    Citation Envoyé par gtapes Voir le message
    Mon problème a été corrigé par le message de Sve@r.
    As-tu examiné en détail le code de Matt_Houston qui 1) répond aussi au besoin de façon bien meilleure et 2) libère tout le monde de ces contraintes d'espace de stockage ???

    Citation Envoyé par gtapes Voir le message
    nbsaut sert a savoir combien de saut (retour a la ligne) l’application a effectuer afin de pouvoir afficher la saisie de l'utilisateur au bon endroit.
    Oui, autrement dit c'est compter combien de fois on trouve "nb" dans "len" !!! Ce n'est pas parce que le principe ou le but fondamental d'une division a été enseigné au CE2 que ça devient faux ou inutile dès qu'on a quitté l'école.
    return (len - 1) / nb + 1 (je te laisse chercher tout seul pourquoi "-1" et pourquoi "+1").
    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]

  15. #15
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Je ne suis pas sûr que printf("\n"); retourne toujours 1. La fonction est censée retourner le nombre de caractères écris, et sur certains systèmes il y a deux caractères écris : un carriage-return et un line-feed.
    Si on part du principe que la chaîne ne contient pas elle-même de CR, j'écrirais par sécurité :
    while (printf("%.*s\n", len, s) >= len + 1 )
    Dans l'absolu, ton guard fait sens. Mais il faut bien préciser ce que l'on entend par « caractères écrits ». En l'occurrence printf renvoie le nombre de bytes transmis aux entrailles de la libc, peu importent les transformations que la chaîne peut subir par la suite. Je serais fort stupéfait s'il était avéré que la manière dont les retours à la ligne sont interprétés par l'OS influencent la valeur de retour de printf et consorts.

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Le seul hic, c'est qu'on ne peut pas créer de tableau statique avec un nombre variable

    Édit : Après vérification, c99 au minimum (gcc XXX -std=c89 -pedantic -Wall ougcc XXX -std=c90 -pedantic -Wall)
    Dans le système ou je suis, le fait de créer un tableau statique avec un nombre de variable ne pose pas de problème.

    Oui, autrement dit c'est compter combien de fois on trouve "nb" dans "len" !!! Ce n'est pas parce que le principe ou le but fondamental d'une division a été enseigné au CE2 que ça devient faux ou inutile dès qu'on a quitté l'école.
    return (len - 1) / nb + 1 (je te laisse chercher tout seul pourquoi "-1" et pourquoi "+1").
    Pour ce qui est du return , je garderais nbsaut car si quelqu'un d'autre lis le code , il sera plus facile de savoir ce que la fonction retourne.

    De toute manière, il y a aussi l'initialisation de la variable nbsaut qui est trop tôt.
    Cela na aucune importance qu'il variable soit initialiser trop tôt ?

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Citation Envoyé par gtapes Voir le message
    Cela na aucune importance qu'il variable soit initialiser trop tôt ?
    Disons, que pour l'instant, tu codes en C, mais tu es débutant
    Et à partir de C99, on s'en fiche.

    Parce que le C (comme le C++) a eu des normes (89, 90, 99, 11, ...) qui ont apporté des modifications au langage.
    Les tableaux à taille variable ne sont possible qu'à partir de C99.
    Avant C99, il fallait déclarer toutes ces variables au début du bloc avant de coder (faire une initialisation c'est du code)
    Je peux aussi parler des commentaires \\, du mot-clef size_t, ...

    Mais tu es débutant, tu sembles utiliser soit gcc soit clang (voir peut-être g++), donc pour l'instant tu t'en cognes

    Mais un jour, tu comprendras. Par exemple, lorsque tu utiliseras Microsoft Visual 2010 ou 2013 et que ton code va klaxonner de partout, tu comprendras

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    J'ai un problème qui découle de la fonction.
    le problème est que lorsque j'affiche la chaîne couper j'ai certain caractère qui ne s'affiche pas correctement
    par exemple le è, é,²
    j'ai fait le code suivant pour remplacer ces caractères mais lors de l'affichage je n'est plus le libelle en entier.

    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
     
    void formater_string(char *chaine)
    {
     
    	unsigned short i; 
    	unsigned short len = strlen(chaine);
    	char tab[len+1]; 
    	tab[0] = '\0'; 
     
    	for (i=0;i<len;i++){
    		if(strcmp (chaine+i,"é")==0){
    			strcpy(tab,"\202");
    		} else {
    			strncpy(tab, chaine+i,len);		
    		}
    	}
    		printf("\n%s", tab);
     
    }

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Citation Envoyé par gtapes Voir le message
    par exemple le è, é,²
    Il faut dans un premier temps que tu comprennes la différence entre ASCII - MBCS - Unicode (UTF-8, UTF-16 et UTF-32)

    Une fois que tu as compris cela, tu sauras que les fonctions strXXX travaillent en ASCII et qu'il existe les versions UTF-16 wcXXX avec le type wchar_t (<- lien cplusplus)
    Et comme tu codes en C, le support UTF-8 n'est pas fourni : il faut tout faire à la main

    Mais cela ne sera pas suffisant parce que même si ton code est correct, l'affichage peut ne pas être configuré et notamment la ligne de commandes Windows qui est en codepage OEM.
    Et là, il faudra également apprendre à configurer l'affichage

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 630
    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 630
    Points : 30 860
    Points
    30 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gtapes Voir le message
    Pour ce qui est du return , je garderais nbsaut car si quelqu'un d'autre lis le code , il sera plus facile de savoir ce que la fonction retourne.
    Oui, c'est vrai que mettre des commentaires ça fait trop "has been"...

    Citation Envoyé par gtapes Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(strcmp (chaine+i,"é")==0) {
    	// parce qu'écrire if (chaine[i] == 'é') est vraiment trop trop simple pour si quelqu'un d'autre lis le code !!!
    	strcpy(tab,"\202");
    T'es sûr que tu veux réinitialiser complètement "tab" à chaque fois que tu trouveras un "é" dans ta chaine ???

    Citation Envoyé par gtapes Voir le message
    tab[0] = '\0';
    Même pas foutu de lire ce que j'explique sur les chaines ni de recopier un code tout fait sans se tromper
    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]

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2013, 20h03
  2. Algo pour crée une chaîne en fonction d'un nombre
    Par megamario dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/01/2011, 19h12
  3. Tri sur une chaîne de caractères contenant des nombres
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2006, 12h52
  4. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 10h58
  5. Découper une chaîne de la droite
    Par Gourouni dans le forum ASP
    Réponses: 4
    Dernier message: 10/03/2005, 12h38

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