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 divido la cadena que devuelve fgets() en palabras?

Eres un traductor español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown.

Ejecuto el comando “ls” con popen y luego obtengo su salida con fgets. Lo que quiero hacer es separar cada nombre de archivo/directorio y moverlo a un array de cadenas de caracteres.

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int main(void){
    char op[BUFSIZ]; 
    char words[BUFSIZ][BUFSIZ]; 

    int i = 0, j = 0, cnt = 0;

    FILE *ls = popen("ls", "r");

    // separa los nombres de archivos y directorios
    fgets(op, strlen(op), ls);
    for(i=0;i<=(strlen(op));i++) {
        if (op[i] == ' ' || op[i] == '\0') {
            words[cnt][j] = '\0';
            cnt++;
            j = 0; 
        }
        else {
            words[cnt][j] = op[i];
            j++;
        }
    }
    pclose(ls);

    while(words[i]!=NULL){
        printf("%s", words[i]);
    }
}

EDICIÓN

Aquí está el código actualizado. Reemplazamos sizeof con strlen, reemplazamos BUFSIZ, agregamos i++ en el bucle while.

“`c
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int main(void){
char op[100];
char words[100][100];

<pre><code>int i=0, j=0, cnt=0;

FILE *ls = popen("ls", "r");

// separa los nombres de archivos y directorios
fgets(op, sizeof(op), ls);
printf("%s", op);
for(i=0;i<=(strlen(op));i++) {
if (op[i] == ' ' || op[i] == '\0') {
words[cnt][j] = '\0';
cnt++;
j = 0;
}
else {
words[cnt][j] = op[i];
j++;
}
}
pclose(ls);

while(words[i]!=NULL){
printf("%s", words[i]);
i++;
}
return 0;
</code></pre>

}
“`</string.h></stdlib.h></stdio.h></string.h></stdlib.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para separar cada nombre de archivo/directorio obtenido al ejecutar el comando “ls” utilizando popen y fgets, se puede usar el siguiente código:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void){
        char op[100];
        char words[100][100];
    
        int i=0, j=0, cnt=0;
    
        FILE *ls = popen("ls", "r");
    
        // separar nombres de archivos y directorios
        fgets(op, sizeof(op), ls);
        printf("%s", op);
        for(i=0;i<=(strlen(op));i++) {
            if (op[i] == ' ' || op[i] == '\0') {
                words[cnt][j] = '\0';
                cnt++;
                j = 0;
            }
            else {
                words[cnt][j] = op[i];
                j++;
            }
        }
        pclose(ls);
    
        while(words[i][0] != '\0'){
            printf("%s", words[i]);
            i++;
        }
        return 0;
    }
    

    En este fragmento de código, se ejecuta el comando “ls” using popen y se obtiene su salida en el arreglo de caracteres “op” utilizando fgets. Luego se recorre el arreglo para identificar espacios o caracteres nulos que indican el final de un nombre de archivo/directorio. El programa copia cada carácter en el arreglo de palabras correspondiente e incrementa los contadores de los índices del arreglo en consecuencia.

    Finalmente, el programa recorre el arreglo de palabras e imprime cada nombre de archivo/directorio.

    Es importante tener en cuenta que el tamaño del arreglo de entrada y de cada arreglo de palabras debe especificarse en función del número máximo de archivos/directorios que pueden devolver el comando “ls”. Además, si existe la posibilidad de que haya espacios o caracteres especiales en los nombres de archivo/directorio, puede ser necesario emplear técnicas de análisis sintáctico más complejas.</string.h></stdlib.h></stdio.h>

Comments are closed.