StringTokenizer

StringTokenizer - Java - Programmation

Marsh Posté le 13-03-2003 à 09:46:46    

Est ce qu'il existe l'equivalent de StringTokenizer en C ou C++? Ou une methode qui fait un truc similaire?
 
Merci

Reply

Marsh Posté le 13-03-2003 à 09:46:46   

Reply

Marsh Posté le 13-03-2003 à 09:54:58    

Place plutôt ton post dans la catégorie C C++


Message édité par walli le 13-03-2003 à 09:55:13
Reply

Marsh Posté le 13-03-2003 à 10:08:34    

polo021 a écrit :

Est ce qu'il existe l'equivalent de StringTokenizer en C ou C++? Ou une methode qui fait un truc similaire?
 
Merci


 
en C : strtok
-> c qd même vachement moins bien fiat, ms bon, ça date plus aussi !

Reply

Marsh Posté le 13-03-2003 à 10:09:53    

strtok : http://www.cplusplus.com/ref/cstring/strtok.html
 
En même temps, je crois que c'est pas bien comme méthode, pour je ne sais plus quelle raison [:spamafote] Un pro du C/C++ te renseignera mieux que moi.
 
EDIT : grillaid :cry:


Message édité par Taiche le 13-03-2003 à 10:10:10

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-03-2003 à 10:24:29    

c'est ca que je cherchais. Merci :jap:

Reply

Marsh Posté le 13-03-2003 à 10:43:58    

Ceci dit, tu peux t'en réécrire un qui soit plus propre.
Voici le code de la classe Java, le transcrire en C++ ne sera pas difficile.

Code :
  1. import java.util.Enumeration;
  2. import java.util.NoSuchElementException;
  3. /**
  4. * The string tokenizer class allows an application to break a  
  5. * string into tokens. The tokenization method is much simpler
  6. * than the one used by the <tt>StreamTokenizer</tt> class.
  7. * The <tt>Tokenizer</tt> methods do not distinguish among  
  8. * identifiers, numbers, and quoted strings, nor do they
  9. * recognize and skip comments.  
  10. * <p>
  11. * The set of delimiters (the characters that separate tokens)  
  12. * may be specified either at creation time or on a per-token
  13. * basis.  
  14. * <p>
  15. * An instance of <tt>Tokenizer</tt> behaves in one of two  
  16. * ways, depending on whether it was created with the  
  17. * <tt>returnDelims</tt> flag having the value <tt>true</tt>  
  18. * or <tt>false</tt>:  
  19. * <ul>
  20. * <li>If the flag is <tt>false</tt>, delimiter characters serve
  21. *     to separate tokens. A token is a maximal sequence of  
  22. *     consecutive characters that are not delimiters.  
  23. * <li>If the flag is <tt>true</tt>, delimiter characters are  
  24. *     themselves considered to be tokens. A token is thus either one delimiter  
  25. *     character, or a maximal sequence of consecutive characters that are  
  26. *     not delimiters.
  27. * </ul><p>
  28. * A <tt>Tokenizer</tt> object internally maintains a current  
  29. * position within the string to be tokenized. Some operations advance this  
  30. * current position past the characters processed.<p>
  31. * A token is returned by taking a substring of the string that was used to  
  32. * create the <tt>Tokenizer</tt> object.
  33. * <p>
  34. * The following is one example of the use of the tokenizer. The code:
  35. * <blockquote><pre>
  36. *     Tokenizer st = new Tokenizer("this is a test" );
  37. *     while (st.hasMoreTokens()) {
  38. *         println(st.nextToken());
  39. *     }
  40. * </pre></blockquote>
  41. * <p>
  42. * prints the following output:
  43. * <blockquote><pre>
  44. *     this
  45. *     is
  46. *     a
  47. *     test
  48. * </pre></blockquote>
  49. * <p>
  50. * This class is a replacement for <tt>java.util.StringTokenizer</tt>
  51. * (Sun's implementation has a bug).
  52. */
  53. public class Tokenizer implements Enumeration {
  54.   /**
  55.    * Default delimiters "<tt>\t\n\r\f</tt>":
  56.    * the space character, the tab character, the newline character,
  57.    * the carriage-return character, and the form-feed character.
  58.    */
  59.   public static final String DEFAULT_DELIMITERS = " \t\n\r\f";
  60.   /** String to tokenize. */
  61.   private String str;
  62.   /** Delimiters. */
  63.   private String delimiters;
  64.   /** Flag indicating whether to return the delimiters as tokens. */
  65.   private boolean returnTokens;
  66.   /** Previous token start. */
  67.   private int previous = -1;
  68.   /** Current position in <tt>str</tt> string. */
  69.   private int currentPosition;
  70.   /** Maximal position in <tt>str</tt> string. */
  71.   private int maxPosition;
  72.   /**
  73.    * Constructs a string tokenizer for the specified string. All characters
  74.    * in the <tt>delimiters</tt> argument are the delimiters for separating
  75.    * tokens.
  76.    * <p>
  77.    * If the <tt>returnTokens</tt> flag is <tt>true</tt>, then the delimiter
  78.    * characters are also returned as tokens. Each delimiter is returned as
  79.    * a string of length one. If the flag is <tt>false</tt>, the delimiter
  80.    * characters are skipped and only serve as separators between tokens.
  81.    *
  82.    * @param str           a string to be parsed
  83.    * @param delimiters    the delimiters
  84.    * @param returnTokens  flag indicating whether to return the delimiters
  85.    *                      as tokens
  86.    */
  87.   public Tokenizer(String str, String delimiters, boolean returnTokens) {
  88.     this.str          = str;
  89.     this.delimiters   = delimiters;
  90.     this.returnTokens = returnTokens;
  91.     this.maxPosition  = str.length();
  92.   }
  93.   /**
  94.    * Constructs a string tokenizer for the specified string. The characters
  95.    * in the <tt>delimiters</tt> argument are the delimiters for separating
  96.    * tokens. Delimiter characters themselves will not be treated as tokens.
  97.    *
  98.    * @param str          a string to be parsed
  99.    * @param delimiters   the delimiters
  100.    */
  101.   public Tokenizer(String str, String delimiters) {
  102.     this(str, delimiters, false);
  103.   }
  104.   /**
  105.    * Constructs a string tokenizer for the specified string. The character
  106.    * in the <tt>delimiters</tt> argument is the delimiter for separating
  107.    * tokens. Delimiter character themselves will not be treated as token.
  108.    *
  109.    * @param str          a string to be parsed
  110.    * @param delimiters   the delimiter
  111.    */
  112.   public Tokenizer(String str, char delimiters) {
  113.     this(str, String.valueOf(delimiters), false);
  114.   }
  115.  
  116.   /**
  117.    * Constructs a string tokenizer for the specified string. The tokenizer
  118.    * uses the default delimiter set, which is "<tt> \t\n\r\f</tt>":
  119.    * the space character, the tab character, the newline character, the
  120.    * carriage-return character, and the form-feed character. Delimiter
  121.    * characters themselves will not be treated as tokens.
  122.    *
  123.    * @param str          a string to be parsed
  124.    */
  125.   public Tokenizer(String str) {
  126.     this(str, Tokenizer.DEFAULT_DELIMITERS, false);
  127.   }
  128.   /**
  129.    * Tests if there are more tokens available from this tokenizer's string.
  130.    * If this method returns <tt>true</tt>, then a subsequent call to {@link
  131.    * #nextToken nextToken} with no argument will successfully return a token.
  132.    *
  133.    * @return <tt>true</tt> if and only if there is at least one token in the
  134.    *         string after the current position; <tt>false</tt> otherwise.
  135. */
  136.   public boolean hasMoreTokens() {
  137.     if (this.currentPosition < this.maxPosition) {
  138.       return true;
  139.     }
  140.     else if (this.currentPosition == this.maxPosition) {
  141.       return (this.maxPosition == 0  ||
  142.               (this.returnTokens  &&  this.delimiters.indexOf(this.str.charAt(this.previous)) >= 0));
  143.     }
  144.     else {
  145.       return false;
  146.     }
  147.   }
  148.   /**
  149.    * Returns the next token from this string tokenizer.
  150.    *
  151.    * @return the next token from this string tokenizer
  152.    *
  153.    * @throws NoSuchElementException  if there are no more tokens in this
  154.    *                                 tokenizer's string.
  155.    */
  156.   public String nextToken() throws NoSuchElementException {
  157.     if (this.currentPosition == this.maxPosition  &&
  158.         (this.maxPosition == 0  ||
  159.          (this.returnTokens  &&  this.delimiters.indexOf(this.str.charAt(this.previous)) >= 0))) {
  160.       this.currentPosition++;
  161.       return new String();
  162.     }
  163.  
  164.     if (this.currentPosition >= this.maxPosition) {
  165.       throw new NoSuchElementException();
  166.     }
  167.  
  168.     int     start  = this.currentPosition;
  169.     String  result = null;
  170.  
  171.     if (this.delimiters.indexOf(this.str.charAt(start)) >= 0) {
  172.       if (this.previous == -1 ||
  173.         (this.returnTokens  &&  this.previous != this.currentPosition  &&
  174.          this.delimiters.indexOf(this.str.charAt(this.previous)) >= 0)) {
  175.         result = new String();
  176.       }
  177.       else if (this.returnTokens) {
  178.         result = this.str.substring(start, ++this.currentPosition);
  179.       }
  180.  
  181.       if (!returnTokens) {
  182.         currentPosition++;
  183.       }
  184.     }
  185.  
  186.     this.previous = start;
  187.     start         = this.currentPosition;
  188.  
  189.     if (result == null) {
  190.       while (this.currentPosition < this.maxPosition  &&
  191.              this.delimiters.indexOf(this.str.charAt(this.currentPosition)) < 0) {
  192.         this.currentPosition++;
  193.       }
  194.     }
  195.  
  196.     return ((result == null) ? this.str.substring(start, this.currentPosition) : result);
  197.   }
  198.   /**
  199.    * Returns the next token in this string tokenizer's string. First, the
  200.    * set of characters considered to be delimiters by this <tt>Tokenizer</tt>
  201.    * object is changed to be the characters in the string <tt>delimiters</tt>.
  202.    * Then the next token in the string after the current position is
  203.    * returned. The current position is advanced beyond the recognized token.
  204.    * The new delimiter set remains the default after this call.
  205.    *
  206.    * @param delimiters the new delimiters.
  207.    *
  208.    * @return the next token, after switching to the new delimiter set.
  209.    *
  210.    * @throws NoSuchElementException  if there are no more tokens in this
  211.    *                                    tokenizer's string.
  212.    */
  213.   public String nextToken(String delimiters) throws NoSuchElementException {
  214.     this.delimiters = delimiters;
  215.     return this.nextToken();
  216.   }
  217.   /**
  218.    * Returns the same value as the <tt>hasMoreTokens</tt> method.
  219.    * It exists so that this class can implement the
  220.    * <tt>Enumeration</tt> interface.
  221.    *
  222.    * @return <tt>true</tt> if there are more tokens; <tt>false</tt>
  223.    *         otherwise.
  224.    */
  225.   public boolean hasMoreElements() {
  226.     return this.hasMoreTokens();
  227.   }
  228.   /**
  229.    * Returns the same value as the <tt>nextToken</tt> method, except that its
  230.    * declared return value is <tt>Object</tt> rather than <tt>String</tt>. It exists so that
  231.    * this class can implement the <tt>Enumeration</tt> interface.
  232.    *
  233.    * @return the next token in the string
  234.    *
  235.    * @throws NoSuchElementException  if there are no more tokens in this
  236.    *                                 tokenizer's string
  237.    */
  238.   public Object nextElement() {
  239.     return this.nextToken();
  240.   }
  241.   /**
  242.    * Calculates the number of times that this tokenizer's nextToken method
  243.    * can be called before it generates an exception. The current position
  244.    * is not advanced.
  245.    *
  246.    * @return  the number of tokens remaining in the string using the
  247.    *          current delimiter set
  248.    */
  249.   public int countTokens() {
  250.     int  curr  = this.currentPosition;
  251.     int  count = 0;
  252.  
  253.     for (int i = curr; i < this.maxPosition; i++) {
  254.       if (this.delimiters.indexOf(this.str.charAt(i)) >= 0) {
  255.         count++;
  256.       }
  257.  
  258.       curr++;
  259.     }
  260.  
  261.     return count + (this.returnTokens ? count : 0) + 1;
  262.   }
  263.   /**
  264.    * Resets this tokenizer's state so the tokenizing starts from the begin.
  265.    */
  266.   public void reset() {
  267.     this.previous = -1;
  268.     this.currentPosition  = 0;
  269.   }
  270.   /**
  271.    * Constructs a string tokenizer for the specified string. All characters
  272.    * in the <tt>delimiters/tt> argument are the delimiters for separating tokens.
  273.    * If the <tt>returnTokens</tt> flag is <tt>true</tt>, then the delimiter
  274.    * characters are also returned as tokens. Each delimiter is returned as
  275.    * a string of length one. If the flag is <tt>false</tt>, the delimiter
  276.    * characters are skipped and only serve as separators between tokens.
  277.    * Then tokenizes the <tt>str</tt> and return an <tt>String[]</tt> array
  278.    * with tokens.
  279.    *
  280.    * @param str           a string to be parsed
  281.    * @param delimiters    the delimiters
  282.    * @param returnTokens  flag indicating whether to return the delimiters
  283.    *                      as tokens
  284.    *
  285.    * @return array with tokens
  286.    */
  287.   public static String[] tokenize(String str, String delimiters,
  288.                                   boolean returnTokens) {
  289.     Tokenizer  tokenizer = new Tokenizer(str, delimiters, returnTokens);
  290.     String[]   tokens    = new String[tokenizer.countTokens()];
  291.  
  292.     for (int i = 0; i < tokens.length; i++) {
  293.       tokens[i] = tokenizer.nextToken();
  294.     }
  295.  
  296.     return tokens;
  297.   }
  298. }

Reply

Marsh Posté le 13-03-2003 à 11:08:01    

perso, je trouve domage qu'en Java y ait pas de un StringTokenizer plus évolué ...
 
en plus, on peut pas étendre l'existant parce qu'ils ont foutu tous les attributs en private  :gun:


Message édité par benou le 13-03-2003 à 11:08:24
Reply

Marsh Posté le 13-03-2003 à 11:24:25    

BifaceMcLeOD a écrit :

Ceci dit, tu peux t'en réécrire un qui soit plus propre.
Voici le code de la classe Java, le transcrire en C++ ne sera pas difficile.


 
je pense que je vais me contenter de strtok.

Reply

Marsh Posté le 13-03-2003 à 11:40:13    

El_gringo a écrit :


 
en C : strtok
-> c qd même vachement moins bien fiat, ms bon, ça date plus aussi !

merci de ne pas troller sur les voitures dans ce forum. :jap:
y'a discussion pour ça. :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 13-03-2003 à 11:41:25    

the real moins moins a écrit :

merci de ne pas troller sur les voitures dans ce forum. :jap:
y'a discussion pour ça. :o


[:the real moins moins]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-03-2003 à 11:41:25   

Reply

Marsh Posté le 13-03-2003 à 11:41:28    

the real moins moins a écrit :

merci de ne pas troller sur les voitures dans ce forum. :jap:
y'a discussion pour ça. :o


 
 [:rofl]  [:t3xla]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 13-03-2003 à 12:26:51    

the real moins moins a écrit :

merci de ne pas troller sur les voitures dans ce forum. :jap:
y'a discussion pour ça. :o


 
... :pfff:  que dire !

Reply

Marsh Posté le 13-03-2003 à 12:59:04    

enfin ecrire un tokenizer en C++ avec les methodes des std::string, ca se fait tout seul

Reply

Marsh Posté le 13-03-2003 à 15:42:08    

benou a écrit :

perso, je trouve domage qu'en Java y ait pas de un StringTokenizer plus évolué ...
 
en plus, on peut pas étendre l'existant parce qu'ils ont foutu tous les attributs en private  :gun:

StreamTokenizer peut-être ?
 
Question : les sources des classes de base, on les trouve ou ?

Reply

Marsh Posté le 13-03-2003 à 15:45:30    

noldor a écrit :


Question : les sources des classes de base, on les trouve ou ?


Bin lors de l'install de ton JDK, t'as le choix d'installer les sources [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-03-2003 à 15:58:08    

Taiche a écrit :


Bin lors de l'install de ton JDK, t'as le choix d'installer les sources [:spamafote]

ah purée, j'ai même jamais fait gaffe :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed