es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo extraer palabras de paréntesis en lenguaje C?

Estoy intentando extraer palabras de una cadena como esta:

(octopus kitten) (game cake) (soccer football)

Intenté hacer esto con la ayuda de strtok (hago strcpy solo para no modificar el token / cadena original, también usé memcpy, pero es lo mismo en mi caso).

Función principal:

int main (int argc, char * argv []) {

char row [] = “(octopus kitten) (game cake) (soccer football)”;
char * pch;
pch = strtok (fila, “(“);

while (pch! = NULL) {

  pch [strcspn (pch, ")")] = '\0';
  get_and_print_word (pch);
  pch = strtok (NULL, "(");

}

devolver 0;
}

Función para obtener e imprimir cada palabra:

void get_and_print_word (char str []) {

char r [4000];

// para no modificar la cadena original
strcpy (r, str);

char * c = strtok (r, ” “);
for (int i = 0; i <2; i ++) {

  printf ("% s \ n", c);
  c = strtok (NULL, " ");

}
}

Funciona perfectamente bien con una primera iteración, pero después de que pch comience a apuntar a otra dirección de memoria (pero debería apuntar a la dirección de la letra “g”).

Funcionará perfectamente bien (simplemente imprimirá la cadena dentro de los corchetes) si eliminamos get_and_print_word (pch):

int main (int argc, char * argv []) {

char row [] = “(octopus kitten) (game cake) (soccer football)”;
char * pch;
pch = strtok (fila, “(“);

while (pch! = NULL) {

  pch [strcspn (pch, ")")] = '\0';
  printf ("% s \ n", pch);
  pch = strtok (NULL, "(");

}

devolver 0;
}

Pero eso no es lo que quiero hacer, necesito obtener cada palabra, no solo una cadena de dos palabras y un espacio entre ellas.

Usar pch = strtok (NULL, “)( “) tampoco es apropiado en mi caso, porque necesito almacenar cada par de palabras (cada palabra, por supuesto, debe ser una cadena separada) en algún individual estructura, así que definitivamente necesito esta función.

¿Cómo resolver este problema y por qué funciona así?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que la función get_and_print_word utiliza strtok de nuevo para extraer palabras individuales de la cadena de entrada. Sin embargo, strtok es una función que mantiene el estado y modifica la cadena de entrada en la que está trabajando. Por lo tanto, cuando se llama a get_and_print_word con pch como entrada, modifica pch en sí mismo, lo que causa un comportamiento inesperado en la función principal.

    Para solucionar este problema, podemos utilizar un enfoque diferente para extraer palabras de la cadena de entrada. En lugar de utilizar strtok, podemos recorrer los caracteres de la cadena de entrada y extraer cada palabra buscando espacios y paréntesis.

    Aquí hay una implementación actualizada de la función principal que utiliza este enfoque:

    #include <stdio.h>
    #include <string.h>
    
    struct word_pair {
        char first[100];
        char second[100];
    };
    
    void extract_words(char* input, struct word_pair* output, int* count) {
        char* current = input;
        char* start = NULL;
        int length = 0;
    
        while (*current != '\0') {
            if (*current == '(') {
                // inicio de un nuevo par de palabras
                start = current + 1;
                length = 0;
            } else if (*current == ' ' || *current == ')') {
                // fin de una palabra
                if (start != NULL) {
                    if (*count >= 100) {
                        // el búfer de salida está lleno
                        return;
                    }
                    if (length > 0) {
                        // agregar la palabra a la salida
                        char* buffer = output[*count].first;
                        if (strlen(buffer) > 0) {
                            buffer = output[*count].second;
                        }
                        strncpy(buffer, start, length);
                        buffer[length] = '\0';
                    }
                    if (*current == ')') {
                        // fin del par de palabras
                        (*count)++;
                        start = NULL;
                    }
                }
            } else if (start != NULL) {
                // dentro de una palabra
                length++;
            }
            current++;
        }
    }
    
    int main(void) {
        char input[] = "(pulpo gatito) (juego pastel) (fútbol baloncesto)";
        struct word_pair output[100] = {0};
        int count = 0;
    
        extract_words(input, output, &count);
    
        for (int i = 0; i < count; i++) {
            printf("(%s, %s)\n", output[i].first, output[i].second);
        }
    
        return 0;
    }
    

    La función extract_words toma la cadena de entrada, un búfer de salida de tipo word_pair y un puntero a un entero que contendrá el número de pares de palabras extraídos. Recorre los caracteres de la cadena de entrada y extrae cada palabra buscando espacios y paréntesis. Actualiza el búfer de salida y el recuento en consecuencia.

    La función principal llama a extract_words con la cadena de entrada y el búfer de salida. Luego recorre el búfer de salida e imprime cada par de palabras.

    Esta implementación evita el problema con strtok que modifica la cadena de entrada y debería funcionar correctamente para cualquier cadena de entrada en el formato “(palabra1 palabra2) (palabra3 palabra4) …”.</string.h></stdio.h>

Comments are closed.