En cuanto a las otras respuestas, para un principiante en C, se vería complejo debido al tamaño del código, pensé que podría poner esto en un principiante, podría ser más fácil analizar la cadena en lugar de utilizando strtok
... algo como esto:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char **parseInput(const char *str, int *nLen);
void resizeptr(char ***, int nLen);
int main(int argc, char **argv){
int maxLen = 0;
int i = 0;
char **ptr = NULL;
char *str = "valgrind --leak-check=yes --track-origins=yes ./a.out";
ptr = parseInput(str, &maxLen);
if (!ptr) printf("Error!\n");
else{
for (i = 0; i < maxLen; i++) printf("%s\n", ptr[i]);
}
for (i = 0; i < maxLen; i++) free(ptr[i]);
free(ptr);
return 0;
}
char **parseInput(const char *str, int *Index){
char **pStr = NULL;
char *ptr = (char *)str;
int charPos = 0, indx = 0;
while (ptr++ && *ptr){
if (!isspace(*ptr) && *ptr) charPos++;
else{
resizeptr(&ptr, ++indx);
pStr[indx-1] = (char *)malloc(((charPos+1) * sizeof(char))+1);
if (!pStr[indx-1]) return NULL;
strncpy(pStr[indx-1], ptr - (charPos+1), charPos+1);
pStr[indx-1][charPos+1]='\0';
charPos = 0;
}
}
if (charPos > 0){
resizeptr(&pStr, ++indx);
pStr[indx-1] = (char *)malloc(((charPos+1) * sizeof(char))+1);
if (!pStr[indx-1]) return NULL;
strncpy(pStr[indx-1], ptr - (charPos+1), charPos+1);
pStr[indx-1][charPos+1]='\0';
}
*Index = indx;
return (char **)pStr;
}
void resizeptr(char ***ptr, int nLen){
if (*(ptr) == (char **)NULL){
*(ptr) = (char **)malloc(nLen * sizeof(char*));
if (!*(ptr)) perror("error!");
}else{
char **tmp = (char **)realloc(*(ptr),nLen);
if (!tmp) perror("error!");
*(ptr) = tmp;
}
}
poco he modificado el código para hacerlo más fácil. La única función de cadena que usé fue strncpy
..seguro que es un poco largo, pero reasigna dinámicamente la matriz de cadenas en lugar de utilizar un MAX_ARGS codificado, lo que significa que el puntero doble ya está acaparando la memoria cuando solo 3 o 4 harían, lo que también haría que el uso de memoria eficiente y pequeño, mediante el uso de realloc
, el análisis simple se cubre mediante el empleo de isspace
, ya que itera con el puntero. Cuando se encuentra un espacio, realloc
ates el puntero doble, y malloc
el desplazamiento para mantener la cadena.
Observe cómo se usan los punteros triples en la función resizeptr
... de hecho, pensé que esto serviría como un excelente ejemplo de un simple programa C, punteros, realloc, malloc, paso por referencia, elemento básico de análisis una cadena ...
Espero que esto ayude, Saludos cordiales, Tom.
@Sneesh: Este es un excelente ejemplo de cómo puedes hacerlo en C, ya que el viejo adagio es 'Hay muchas maneras de despellejar a un gato ...' +1 de mi parte. – t0mm13b