Tengo muchos problemas para comprender el siguiente flujo del programa:

#include <stdio.h>
#include <ctype.h>

int main ()
{
 FILE *fp;
 int index = 0;
 char word[45];
 int words = 0;

 fp = fopen("names.txt","r");
 if(fp == NULL) 
 {
   perror("Error in opening file");
   return(-1);
 }


 for (int c = fgetc(fp); c != EOF; c = fgetc(fp))
 {
     // allow only alphabetical characters and apostrophes
     if (isalpha(c) || (c == '\'' && index > 0))
     {
         // append character to word
         word[index] = c;
         index++;

         // ignore alphabetical strings too long to be words
         if (index > 45)
         {
             // consume remainder of alphabetical string
             while ((c = fgetc(fp)) != EOF && isalpha(c));

             // prepare for new word
             index = 0;
         }
     }

     // ignore words with numbers (like MS Word can)
     else if (isdigit(c))
     {
         // consume remainder of alphanumeric string
         while ((c = fgetc(fp)) != EOF && isalnum(c));

         // prepare for new word
         index = 0;
     }

     // we must have found a whole word
      else if (index > 0)
     {
         // terminate current word
         word[index] = '\0';

         // update counter
         words++;

         //prepare for next word
         printf("%s\n", word);
         index = 0;
     }
     //printf("%s\n", word);
 }

 printf("%s\n", word);

 fclose(fp);
 return(0);
} 

Como puede ver, es solo un programa simple que almacena caracteres de palabras en una matriz, consecutivamente, desde un archivo llamado 'names.txt'.

Mi problema reside en la condición else if(index > 0). He ejecutado un depurador y, obviamente, el programa funciona correctamente.

Aquí está mi pregunta:

En la primera iteración for-loop, index se convierte en 1. De lo contrario, no podríamos almacenar una palabra completa en una matriz.

Si es así, ¿cómo es posible que, cuando el flujo del programa alcance la condición else if (index > 0), no establezca word[1] en 0? (O los valores posteriores de index).

Simplemente termina la palabra completa y, una vez que ha llegado al final de la palabra, procede a dar word[index] el valor de 0 y pasa a la siguiente palabra.

Intenté leer la documentación, ejecutar la mitad del programa y preguntar con echo, y ejecutar un depurador. Como debería ser, todo funciona perfectamente, no hay problema con el código (que yo sepa). Soy el problema Simplemente no puedo entender cómo funciona.

PD: lo siento si esto puede ser tan trivial para algunos de ustedes, realmente estoy empezando a aprender programación y a veces me resulta muy difícil entender conceptos aparentemente tan simples.

Muchas gracias por su tiempo chicos.

0
Togeri 22 mar. 2017 a las 22:28

2 respuestas

La mejor respuesta

Tan pronto como se ejecuta algo en el bloque if...else, sale del bloque. Entonces, si satisface la primera condición if, la condición else if ni siquiera se verifica. Entonces, si índice> 0 Y c = \ o c es un alfabeto, ejecuta la instrucción if, y si incluso una de estas condiciones no se cumple, se moverá a las partes else if del bloque.

1
lordingtar 22 mar. 2017 a las 19:33

Tenga en cuenta el else al comienzo de la condición else if (index > 0).

Esto significa que solo se ejecutará si ninguno de los if() y else if() ejecutados anteriormente.

Las declaraciones anteriores if() y else if() se siguen ejecutando si el carácter es alfanumérico o una barra diagonal, por lo que el último else if() solo se ejecuta una vez que una barra no alfanumérica o principal es encontrado

1
Mike Nakis 22 mar. 2017 a las 19:37