Estoy tratando de hacer un programa que almacene la longitud de cada palabra en un matriz e imprimirlo. Pero la longitud n no se imprime sino que imprime la longitud n - 1.

#include <stdio.h>

#define IN 1
#define OUT 0
#define MAXLENGTH 10

int main(void)
{
    int i, c, state, word;
    int array[MAXLENGTH];

    state = OUT;
    word = 0;

    for (i = 0; i < MAXLENGTH; i++)
        array[i] = 0;

    while ((c = getchar()) != EOF)
    {
        if (c == '\n' || c == ' ')
            state = OUT;
        else if (state == IN)
        {
            ++array[word];
        }
        else if (state == OUT)
        {
            state = IN;
            ++word;
        }
    }

    for (i = 1; i < MAXLENGTH; i++)
        if (array[i] != 0)
            printf("cuvantu %d are %d caractere \n", i, array[i]);
}
1
user11273428 9 may. 2019 a las 19:12

3 respuestas

La mejor respuesta

Considera este código:

    if (c == '\n' || c == ' ')
        state = OUT;
    else if (state == IN)
    {
        ++array[word];
    }
    else if (state == OUT)
    {
        state = IN;
        ++word;
    }

Cuando c es una nueva línea o espacio, cambia el estado a OUT, presumiblemente significando fuera de una palabra.

Cuando c es otro personaje:

  • Si el estado es IN, cuenta el carácter incrementando array[word], que rastrea la longitud de la palabra actual.
  • Si el estado es OUT, cambia el estado a IN e incrementa word para comenzar a contar una nueva palabra.

En el último caso, no se cuenta el carácter actual; no se realiza ningún incremento a array[word]. Para solucionar esto, inserte ++array[word]; en el último caso:

    if (c == '\n' || c == ' ')
        state = OUT;
    else if (state == IN)
    {
        ++array[word];
    }
    else if (state == OUT)
    {
        state = IN;
        ++word;
        ++array[word];
    }
0
Eric Postpischil 9 may. 2019 a las 16:45

Este parece ser un buen ejercicio para evitar errores comunes fuera de uno.

Si bien podría resolverse de muchas maneras, el siguiente fragmento muestra cómo modificar la lógica de la máquina de estado publicada para que el conjunto de longitudes se pueda llenar desde el principio, sin omitir el primer elemento array[0], hasta ( pero no más allá) su tamaño máximo.

#include <stdio.h>

#define IN 1
#define OUT 0
#define MAXLENGTH 16

int main(void)
{
    int array[MAXLENGTH] = {0};

    int c, state = OUT,   
        n_words = 0; //  <-- this name may better convey the purpose of this variable

    while ((c = getchar()) != EOF)
    {
        if (c == '\n' || c == ' ')  // <-- Consider isspace() and iscntrl() instead.
        {
            // We are between words.
            state = OUT;
        }
        else
        {
            // Check the current state before updating it.
            if ( state == OUT )
            {
                // A new word starts, but there might not be enough space.
                if ( n_words == MAXLENGTH )
                {
                    // Here, the rest of the stream is not consumed
                    ungetc(c, stdin);
                    break;     
                }
                ++n_words; 
            }
            state = IN;

            // Array indices are zero based, so the current word is:
            ++array[n_words - 1];
        }
    }

    if ( c != EOF )
        fprintf(stderr, "Sorry, out of space.\n");

    // You can use the actual number of read words to limit the extent of the loop
    printf(" %5s  %5s\n---------------\n", "Word", "Length");
    for (int i = 0; i < n_words; i++)
        printf("%5d  %5d\n", i + 1, array[i]);
}

El código se puede probar aquí.

0
Bob__ 9 may. 2019 a las 19:16

Intente cambiar el segundo for bucle como- for (i = 0; i < MAXLENGTH; i++)

-1
Nitin Jadhav 9 may. 2019 a las 16:45