En base a esta pregunta, que estaba cerrado con bastante rapidez:
Trying to create a program to read a users input then break the array into seperate words are my pointers all valid?Cómo tokenize (palabras) la clasificación de puntuacion como el espacio
En lugar de cerrar Creo que un trabajo extra podría haber ido a ayudar a la OP para aclarar la cuestión.
La Pregunta:
Quiero tokenize entrada del usuario y almacenar las fichas en una serie de palabras.
Quiero usar la puntuación (., -) como delimitador y así eliminarla de la secuencia de token.
En C Yo usaría strtok()
para dividir una matriz en tokens y luego crear manualmente una matriz.
De esta manera:
La función principal:
char **findwords(char *str);
int main()
{
int test;
char words[100]; //an array of chars to hold the string given by the user
char **word; //pointer to a list of words
int index = 0; //index of the current word we are printing
char c;
cout << "die monster !";
//a loop to place the charecters that the user put in into the array
do
{
c = getchar();
words[index] = c;
}
while (words[index] != '\n');
word = findwords(words);
while (word[index] != 0) //loop through the list of words until the end of the list
{
printf("%s\n", word[index]); // while the words are going through the list print them out
index ++; //move on to the next word
}
//free it from the list since it was dynamically allocated
free(word);
cin >> test;
return 0;
}
La línea tokenizer:
char **findwords(char *str)
{
int size = 20; //original size of the list
char *newword; //pointer to the new word from strok
int index = 0; //our current location in words
char **words = (char **)malloc(sizeof(char *) * (size +1)); //this is the actual list of words
/* Get the initial word, and pass in the original string we want strtok() *
* to work on. Here, we are seperating words based on spaces, commas, *
* periods, and dashes. IE, if they are found, a new word is created. */
newword = strtok(str, " ,.-");
while (newword != 0) //create a loop that goes through the string until it gets to the end
{
if (index == size)
{
//if the string is larger than the array increase the maximum size of the array
size += 10;
//resize the array
char **words = (char **)malloc(sizeof(char *) * (size +1));
}
//asign words to its proper value
words[index] = newword;
//get the next word in the string
newword = strtok(0, " ,.-");
//increment the index to get to the next word
++index;
}
words[index] = 0;
return words;
}
Cualquier comentario sobre el código anterior sería apreciada.
Pero, además, ¿cuál es la mejor técnica para lograr este objetivo en C++?
Aparte de 'cin >> test;' al final, no llamaría a este código de C++. Está claramente usando c técnicas. Hacer esto usando C++ moderno sería ** muy ** diferente. –
Por si acaso decide ir con la versión C de todos modos, tiene una posible pérdida masiva de memoria (cuando cambia el tamaño), y si sucede, no copia los contenidos anteriores (devolviendo punteros a basura). ¿Tal vez tu intención era usar realloc en lugar de malloc? De fuente, solo te aconsejaría ir a la ruta C++, donde ya has recibido algunos consejos, por lo que no tendrás que lidiar con este tipo de problemas C de la vieja escuela;) – Shaggi
@Shaggi: estoy seguro de que es lo que pretendía el autor original de la pregunta original. Pero como dices, la mejor manera es no usar C. –