Partage
  • Partager sur Facebook
  • Partager sur Twitter

Split après un Readline

    7 mars 2011 à 12:13:12

    Bonjour a tous,

    J'ai un petit problème concernant un Split ayant lieu après un Readline. J'explique, je conçoit un petit programme (en console), l'utilisateur rentre la commande (imaginons help -h), je veut que mon programme "split" a l'espace pour que dans un premier temps il analyse le "help" puis dans un deuxième temps le "-h", malheureusement, impossible de le faire.

    Dans mon code actuel, sa se présente grosso-modo comme ceci :

    string cmdinput = Console.Readline();
    string[] cmdtreat = cmdinput.Split(" ");
    switch (cmdtreat[0])
     {
       case "help": 
           blalblabla
       break;
       default:
            blalblalbla
        break;
     }
    


    Mais pas moyen que sa fonctionne. L'erreur sortie est "Impossible de convertir string en char[]" sauf que la encore, j'ai tout tenté. Du "toCharArray" au long code en foreach mais rien n'y fait... Bien entendu mon but est d'arriver a faire sa dans la case help :

    case "help": 
           if(cmdtreat[1] == "-h")
           {
              blablalba
           }
           else
           {
              blubmublu
           }
       break;
    


    En espérant que vous pourrez m'aider :) Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      7 mars 2011 à 13:22:45

      Salut.

      J'aurais dit qu'on ne peut pas faire de switch sur le type string mais après vérification, c'est vrai qu'en C# on peut. Du coup là comme ça je ne vois pas, désolé...
      Elle est où précisément ton erreur, sur quelle instruction ?
      • Partager sur Facebook
      • Partager sur Twitter
        7 mars 2011 à 13:41:49

        Enfaite, j'ai l'erreur sur le "Split" :

        string cmdinput = Console.Readline();
        string[] cmdtreat = cmdinput.Split(" ");
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          7 mars 2011 à 17:13:07

          Utilise un char ' ' et non un string " ".
          • Partager sur Facebook
          • Partager sur Twitter
            8 mars 2011 à 14:25:09

            Le soucis c'est que, quand il n'y a plus d'erreur en mettant la syntaxe suivante :

            string cmdinput = Console.ReadLine();
            string[] cmdtreat = cmdinput.Split(" ");
            


            le Console.WriteLine(cmdtreat[0]); affiche la ligne entière sans s'être couper a l'espace.

            Et si je remplace le string[] par un char[] il me sors une autre erreur qui est qu'il
            est impossible pour lui de convertir.
            • Partager sur Facebook
            • Partager sur Twitter
              8 mars 2011 à 14:40:27

              Le code que de ton dernier post utilise encore un string, c'est etonnant que ca foncionne... Split prends un char et non un string, comme te la dit Aethec.

              bonne journee

              Doum
              • Partager sur Facebook
              • Partager sur Twitter
                8 mars 2011 à 14:47:08

                Le soucis c'est que en char[], il me sors plusieurs erreurs. Avec la syntaxe suivante :

                string cmdinput = Console.ReadLine();
                char[] cmdtreat = cmdinput.Split(' ');
                


                Il me sors "Impossible de convertir implicitement le type "string[]" en "char[]".
                • Partager sur Facebook
                • Partager sur Twitter
                  8 mars 2011 à 14:51:07

                  Hum tu confond le parametre de Split et ta variable.

                  string cmdinput = Console.ReadLine();
                  string[] cmdtreat = cmdinput.Split(' ');
                  


                  cela devrait fonctionner. la fonctione split attends un char en parametre, qui servira de separateur a ton string (ici cmdInput). Par contre la fonction retourne un tableau de string[] donc cmdTreat doit etre du type string[].

                  Doum
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 mars 2011 à 15:02:39

                    Sa fonctionne, c'est une très bonne nouvelle et je t'en remercie. Malheureusement, nouveau soucis. Après avoir sauter de joie, je m'aperçoit qu'il ne prend en compte qu'un mot. C'est à dire que donc avec cette syntaxe :

                    string cmdinput = Console.ReadLine();
                    string[] cmdtreat  = cmdinput.Split(' ');
                    Console.WriteLine(cmdtreat[0]);
                    Console.WriteLine(cmdtreat[1]);
                    Console.WriteLine(cmdtreat[2]);
                    


                    Et quand je rentre "test -h" dans la console, il est normalement sensé me sortir en 0 = test, en 1 l'espace et en 2 le -h sauf que au final il ne m'affiche que test. Est-ce normal ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 mars 2011 à 15:07:08

                      Non ce n'est pas normal. Par contre, affiche ton string[] dans une boucle, pour eviter d'afficher un indice qui n'existe pas, ici cmdTreat[2] si le readLine() est test -h.

                      Lorsque tu execute le code de ton dernier post, tu n'as pas d'erreur?

                      Doum
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mars 2011 à 15:13:27

                        Non aucune erreur. Par contre, je ne peut pas l'afficher dans un boucle car l'intérêt du split ici est de servir au système de comprendre que la demande comporte une option.

                        help étant la demande de l'application "help", le système va me cherchez la fonction "help" qui analyse si il y avait un "-" ou non. Si il comporte une option, il la traite, le "-h" affiche l'aide de l'aide (...). Donc si je l'affiche dans une boucle, il n'y a pas d'intérêt.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 mars 2011 à 15:13:46

                          Si tu splittes la string "test -h" au niveau de l'espace, il y aura 2 éléments dans le tableau (et pas 3): "test", et "-h". L'espace a été "avalé" par l'opération de Split.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 mars 2011 à 15:17:35

                            Oui mais son probleme est que cmdTreat[1] n'affiche rien...

                            La boucle etait juste pour eviter de faire cmdTreat[2] (qui n'existe pas et devrait logiquement faire planter...).

                            ton tableau ne comporte normalement que 2 string:
                            cmdTreat[0] == "test"
                            cmdTreat[1] == "-h"
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 mars 2011 à 17:22:51

                              Au pire tu peux toujours recoder cette fonction :p

                              Sinon pour info split prend un char[] en paramètre d'après la doc de microsoft, pas un char... du coup essaye avec :
                              string[] cmdtreat  = cmdinput.Split(new Char[] {' '});
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                8 mars 2011 à 17:35:30

                                @Samuel >> Si tu tiens à avoir un espace entre chaque résultat, il te faudra le faire manuellement :
                                private static string[] InsertSeparators( string[] array, string separator )
                                {
                                    string[] newArray = new string[array.Length * 2 - 1];
                                    for ( int n = 0; n < array.Length - 1; n++ )
                                    {
                                        newArray[2 * n] = array[n];
                                        newArray[2 * n + 1] = separator;
                                    }
                                    newArray[newArray.Length - 1] = array[array.Length - 1];
                                    return newArray;
                                }
                                


                                iM@x >> Pas besoin. Le char[] est en params, ce qui signifie qu'il est possible d'écrire cmdimput.Split(' ');
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 mars 2011 à 17:48:41

                                  Pourquoi quand moi je fais :
                                  string cmdinput = Console.ReadLine();
                                  string[] cmdtreat = cmdinput.Split(' ');
                                  
                                  for(int i = 0; i < cmdtreat.Length; i++)
                                      Console.WriteLine(cmdtreat[i]);
                                  

                                  ça marche parfaitement ?

                                  @ Aethec :
                                  Au temps pour moi pour le char[], je me coucherai moins bête.
                                  Et apparemment son souci n'est pas de pas avoir les espaces dans son tableau résultat (bien que ça semble l'avoir quand même perturbé), c'est surtout qu'il "perd" le mot qui devrait être à l'indice 0 de son tableau.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 mars 2011 à 20:06:22

                                    Oui, mais le plus etrange est qu'il ne plante pas en essayant d'acceder a des indice qui n'existe pas...
                                    cmdTreat[2] devrait le faire planter. IndexOutOfbound exception ou un truc du genre...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 mars 2011 à 1:56:59

                                      D'où l'intérêt d'afficher le résultat avec une boucle, au moins pour tester, même si dans son programme il n'en a pas besoin. Comme ça il verra vraiment ce que contient son tableau, parce que là c'est bizarre...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        9 mars 2011 à 16:33:32

                                        Ou, plus simple, mettre un point d'arrêt après avoir fait le Split.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Split après un Readline

                                        × 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.
                                        • Editeur
                                        • Markdown