No estoy seguro acerca de tres funciones simples con progtwigción en C

/* stringlength * input: str, pointer to a string * output: integer representing the length of string str, * not counting the terminating character. * * You may NOT call ANY functions within this function. */ int stringlength(char *str) { // count the number of characters in str int count=0,k; for (k=0; str[k] != '\0';k++) count++; return count; } /* countchars * inputs: character c, string str * output: The number of instances of c in the string str * You may not call ANY function calls within this function. */ int countchars(char c, char *str) { // count the number of times c is found in str int k,count=0; for (k=0;str[k]=='\0';k++) { if (str[k] == c) count++; else; } return count; } /* countlines * input: char *filename - string containing the filename * output: integer representing the number of lines in the file */ int countlines(char *filename) { // count the number of lines in the file called filename FILE *f = fopen(filename,"r"); char ch; int lines=0; f = fopen(filename,"r"); do{ ch = fgetc(f); if( ch == '\n') lines++; }while( ch != EOF ); return lines; } 

Necesito ayuda con estas tres funciones diferentes que estoy implementando en mi progtwig. Soy un principiante, así que ten cuidado, la función de líneas de conteo me está causando la mayor cantidad de problemas. Si alguien pudiera explicar por qué no o por qué funcionarán estas funciones, sería muy apreciado.

Hay una serie de problemas en las countlines() :

  1. Abre el archivo dos veces, pero sobrescribe el primer valor de FILE * con el segundo, por lo que no hay forma de cerrarlo. Este es un problema menor.

  2. El principal problema es que la función fgetc() devuelve un int , no un char . En particular, EOF es un valor diferente de cada char .

  3. El código no cierra el archivo antes de volver. Generalmente, si abre un archivo en una función, entonces debería cerrarlo. Si no lo hace, debe pasar el puntero del archivo al código de llamada para que pueda cerrarlo.

  4. El bucle do ... while while rara vez es correcto para un bucle de entrada (una prueba de bucle while en la parte superior es casi siempre más clara y clara) pero al menos no estaba usando feof() .

     int countlines(char *filename) { FILE *fp = fopen(filename,"r"); int ch; int lines = 0; if (fp == 0) return lines; while ((ch = fgetc(fp)) != EOF) { if (ch == '\n') lines++; } fclose(fp); return lines; } 

Cuando usas char lugar, ocurre una de dos cosas:

  • Si su tipo de char está signed , entonces un carácter real (a menudo ÿ – y-umlaut, U + 00FF, LATINA PEQUEÑA LATINA CON DIAERESIS) también coincide con EOF para que pueda dejar de leer antes de llegar al final del archivo.
  • Si su tipo de char unsigned está unsigned , ningún valor coincidirá con EOF por lo que el bucle nunca se detendrá.

En stringlength() , tiene dos variables count y k que se mantienen cuidadosamente en el mismo valor; Solo necesitas uno de los dos.


Aparte de la muesca irregular (endémica en el código mostrado, y definitivamente algo que debe evitarse), y lo innecesario y sin sentido else; que no hace absolutamente nada, el código para countchars() ve bien ( adición tardía ) … tiene la condición en el bucle for invertido; debería ser str[k] != '\0' , por supuesto.