Como dice el título, estoy tratando de crear una función que devuelva 3 valores al leer un documento para una tarea. Quería que funcionara en una función, así que puedo llamar a esa función y generará los 3 valores, pero en este momento el indicador del desarrollador se ejecuta sin cesar y no imprime nada. A continuación se muestra un fragmento de mi código por si alguien pudiera ayudar.

#include <stdio.h>
#include <string.h>
#define LINE 1000

void countLines(int *emptyLines, int *totalLines, int *totalComments)
{
    char line[LINE];
    *emptyLines = 0;
    *totalLines = 0;
    *totalComments = 0;
    FILE *input = fopen("student.java", "r");

    while (fgets(line, LINE, input)) {
        int i;
        int len = strlen(line);
        char *delimiters = "   . , \n \t";
        char *token = strtok(line, delimiters);

        for (i = 0; i < len; i++) {
            if (line[i] != '\n' && line[i] != '\t' && line[i] != ' ') {
                emptyLines++;
                break;
            }
        } // counts all the lines that aren't empty
            
        while (token != NULL) {
            if (strcmp(token, "/**") == 0) {
                totalComments++;
            }
        } // counts the total amount of comments
            
        totalLines++; // counts the total amount of lines
    }
    fclose(input);  
}

int main(int argc, char **argv) {
    FILE *input = fopen("student.java", "r");
    int emptyLines, totalLines, totalComments;
    
    countLines(&emptyLines, &totalLines, &totalComments);

    printf("There are %d total lines, %d lines of code and %d comments in the file\n",
           totalLines, emptyLines, totalComments);
    return 0;
}
c
2
Byronnicle Fry 13 mar. 2021 a las 22:43

1 respuesta

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE 1000

void countLines(){
    char* line = calloc(LINE, sizeof(char));
    if (line == NULL) {
        fprintf(stderr, "ERROR: Unable to alloc memory\n");
        exit(EXIT_FAILURE);
    }
    int emptyLines = 0;
    int totalLines = 0;
    int totalComments = 0;
    FILE *input = fopen("student.java", "r");
    while (fgets(line, LINE, input) != NULL) {
        int i;
        char *delimiters = " .,\n\t";
        char *token = strtok(line, delimiters);
        for (i = 0; line[i]; i++) {
            if (line[i] != '\n' && line[i] != '\t' && line[i] != ' ') {
                emptyLines++;
                break;
            }
        } // counts all the lines that aren't empty
        while (token != NULL) {
            if (strcmp(token, "/**") == 0) {
                totalComments++;
            }
            token = strtok(NULL, delimiters);
        } // counts the total amount of comments
        totalLines++; // counts the total amount of lines
    }
    printf("There are %d total lines, %d lines of code and %d comments in the file\n", totalLines, emptyLines, totalComments);
    fclose(input); 
    free(line); 
}


int main(){
    countLines();
    exit(EXIT_SUCCESS);
}

Ahora funciona:

Se agregó token = strtok(NULL, delimiters); al final de strtok while.

Se usó calloc para asignar char* line con control de la memoria asignada.

Abrió solo una vez el archivo en lugar de dos.

Se cambió la función countLines de (*int, *int, *int) -> void a (void) -> void.

Un consejo es leer el manual si va a utilizar una función que no conoce y aclarar con sangría.

2
ClaudioDeLise 14 mar. 2021 a las 14:52