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 :

String.Copy & String.Substring


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut String.Copy & String.Substring
    Bonjour a tous, je suis débutant en C# et je cherche à faire je vous présente ma fonction :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    public void creationListe()
            {
                FileStream file = new FileStream("liste.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
                StreamReader chaine = new StreamReader(file, Encoding.UTF8);
                String mot, canoniser;
                List<string> mots;
    
                while (chaine.ReadLine() != null)
                {
                    /* Récupération de chaque mot dans la liste puis canonisation du 
                        mot. Insertion dans le dictionnaire, la clé sera le mot
                        canonisé. La donnée sera une liste de tous les anagrammes. */
                    
                    canoniser = "";
                    mot = chaine.ReadLine();
                    if (mot.Length != 0)
                    {
                        string tmp, tmp2;
                        for (int pos1 = 0; pos1 < mot.Length; pos1++)
                        {
                            tmp = mot.Substring(pos1, 1);
                            if (canoniser.Length == 0)
                            {
                                canoniser = String.Copy(tmp);
                            }
                            else
                            {
                                for (int pos2 = 1; pos2 <= canoniser.Length; pos2++)
                                {
                                    tmp2 = canoniser.Substring(pos2, 1);
                                    if (String.Compare(tmp, tmp2) < 0)
                                    { canoniser.Insert(pos2, tmp); }
                                }
                            }
                        } // Fin du for
    
                        if (liste.Count() == 0)
                        {
                            mots = new List<string>();
                            mots.Add(mot);
                            liste.Add (canoniser,mots);
                        }
                        else
                        {
                            foreach (KeyValuePair<string, List<string>> element in liste)
                            {
                                if (liste.ContainsKey(canoniser))
                                {
                                    mots = element.Value;
                                    mots.Add(mot);
                                }
                                else
                                {
                                    mots = new List<string>();
                                    mots.Add(mot);
                                    liste.Add(canoniser, mots);
                                }
                            } // Fin du foreach
                        } // Fin du Liste.Count()
                    } //Fin du if   
                } // Fin du while
                chaine.Close();
                file.Close();
            } // Fin fonction
    L'exception ArgumentOutOfRangeException à la ligne rouge !! Pour avoir controler la chaine canoniser elle est totalement vide !! J'ai un soucis dans l'affectation de tmp dans canoniser. Un petit soutien dans la création et l'affectation de tmp dans canoniser pourrait m'aider. Mais toutes vos suggestions sur la fonction sont également les bienvenus !!

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Il y a un problème dans ton algorithme je pense.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp2 = canoniser.Substring(pos2, 1);
    Tu cherche à récupérer le caractère à la position pos2 dans la chaîne, mais pos2 démarre à 1. Hors, à ce stade, ta chaîne est censée contenir un caractère au minimum. Ton index de départ est donc trop grand à ce moment.

    Au passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canoniser = String.Copy(tmp);
    Peut être simplifié ainsi
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maChaine.Substring(pos2, 1);
    En
    Puisque l'on veut prendre un caractère (longueur 1 pour la découpe). On ajoute un ToString éventuellement si on veut manipuler l'ensemble comme une chaîne.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    le soucis c'est que :

    me provoque un plantage au lancement du programme et je revois l'exception : System.InvalidOperationException.

    La première chose qui m'est venu à l'esprit c'est bien entendu ce code là. En fait canoniser demeure toujours vide il faut qu'à cette instruction j'initialise ma chaine et je ne comprends pas pour je ne peux pas le faire.

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tu es certain que c'est cette ligne qui génère l'exception ? Car une affectation de chaîne ne peut normalement pas lancer une exception InvalidOperationException.

    Tu pourrais préciser ton environnement de travail (version du framework utilisée, ...) ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Par défaut
    Je pense que ce qui ne vas pas c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int pos2 = 1; pos2 <= canoniser.Length; pos2++)
    Le premier index d'une chaine est 0. Donc tu perds le premier caractères de ta chaine.
    Ensuite, pos2 <= canoniser.Length, va forcement planté lors d'un substring sur pos2. A cause de ce fameux index à 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string str = "01"; // str.Length = 2
    string c1= str.Substring(0, 1); // "0"
    string c2= str.Substring(1, 1); // "1"
    string c3= str.Substring(2, 1); // Exception, tu est hors de la chaine de caractères.
    Au final for devrais avoir cette tête pour ton opération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int pos2 = 0; pos2 < canoniser.Length; pos2++)
    Sur le reste je rejoins StormimOn

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    j'ai décidé de reprendre ma fonction et j'ai une question à vous poser vous qui avez un regard aiguisé et des connaissances pointus .

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public void creationListe()
            {
                FileStream file = new FileStream("liste.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
                StreamReader chaine = new StreamReader(file, Encoding.UTF8);
                String mot = "";
                String canoniser = "";
                List<string> mots;
    
                while (mot != null)
                {
                    /* Récupération de chaque mot dans la liste puis canonisation du mot
                       Insertion dans le dictionnaire, la clé sera le mot canonisé. La donnée
                       sera une liste de tous les anagrammes. */
                    mot = chaine.ReadLine();
    
                    if(mot.Length != 0)
                    {
    
                        if (liste.Count() == 0)
                        {
                            mots = new List<string>();
                            mots.Add(mot);
                            liste.Add (canoniser,mots);
                        }
                        else
                        {
                            foreach (KeyValuePair<string, List<string>> element in liste)
                            {
                                if (liste.ContainsKey(canoniser))
                                {
                                    mots = element.Value;
                                    mots.Add(mot);
                                }
                                else
                                {
                                    mots = new List<string>();
                                    mots.Add(mot);
                                    liste.Add(canoniser, mots);
                                }
                            } // Fin du foreach
                        } // Fin du Liste.Count()
                    } //Fin du if   
                } // Fin du while
                chaine.Close();
                file.Close();
            } // Fin fonction
    Mais voilà bug et le débuggueur indique pour la ligne en rouge :

    L'Exception NullReferenceException n'a pas été géré.

    Avec un conseil : utiliser le mot clé "new" pour créer une instance d'objet.

    Dois t'on absolument ici utiliser un new ici et lequel utiliser puisque le new String() n'existe pas !!

  7. #7
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    salut,

    La methode ReadLine() de StreamReader renvoie null en fin de fichier...donc, tu auras une NullReferenceException avec ton code...

    En vitesse (parce qu'il est tard), je ferais:

    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
     
    using (StreamReader sr = new StreamReader("liste.txt")){
       while (sr.Peek() >= 0) {
          string mot = sr.ReadLine();
           foreach (KeyValuePair<string, List<string>> element in liste){
             if (liste.ContainsKey(canoniser)){
               mots = element.Value;
               mots.Add(mot);
             }else{
               mots = new List<string>();
               mots.Add(mot);
               liste.Add(canoniser, mots);
             }
           }
        }
    }
    PAr contre, dans ton code, je ne te vois pas affecter canoniser...

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

Discussions similaires

  1. Copie de string
    Par Benco1664 dans le forum Langage
    Réponses: 7
    Dernier message: 02/09/2014, 10h40
  2. Copie de String Avec Accents ou Apostrophe
    Par progamer54 dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2007, 10h40
  3. [Debutant] string.copy désapprouvé
    Par alainpeniche dans le forum Débuter
    Réponses: 2
    Dernier message: 18/09/2007, 09h31
  4. copie de string donne une chaine vide
    Par zmatz dans le forum SL & STL
    Réponses: 5
    Dernier message: 15/10/2005, 15h31
  5. Problème de copie de string dans string
    Par kazarn dans le forum SL & STL
    Réponses: 17
    Dernier message: 15/03/2005, 18h35

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