Q:

He de comparar un password leído por el teclado y lo compara con un determinado string

Tengo un código que compara un password leído del teclado, con un determinado string. En este caso de tres letras, pero el problema es que si entro más caracteres de los que he puesto para la entrada, input[8], en la siguiente comparación utiliza estos últimos como string para hacer la comparación. 
¿Cómo puedo evitarlo?
He intentado resolverlo con el aumento del input[128] y funciona, pero quería saber si hay alguna solución mas, que no reserve tanta memoria.
También he intentado limpiar el buffer después de cada lectura con fpurge(stdin). Pero no sé si la he puesto en el sitio adecuado porque no ha funcionado.
estoy con Ubuntu 14.04. Ya sé que es antiguo. pero el ordenador en el que está también lo es y no admite más actualizaciones.  
Gracias
Este es mi código:
#include <stdio.h>
#include <string.h>

struct {
    char input[8];
    char test[8];
} data;

int main(int argc, char *argv[])
{

    sprintf(data.test, "uoc");

    do
    {
        printf("Passwd? ");
        scanf("%s", data.input);
    }
    while (strcmp(data.input, data.test) != 0);

    printf("Passwd OK\n");
    return(0);
} 

A:

Primero, ten mucho cuidado con scanf sin limitar el número de caracteres a leer, si scanf toma más caracteres del buffer de los que tu array de char puede almacenar tendrás un desbordamiento de buffer, que puede terminar ocasionando una violación de acceso (Segmentation fault) o terminar modificando posiciones de memoria del propio programa que no debería (lo cual es peor si cabe porque no es tan fácil de depurar).
Puedes usar fgets, leer solo los caracteres que permita almacenar el array y comprobar si el carácter de nueva linea está presente o no. Si no lo está, ha quedado caracteres en el buffer, lo limpiamos y iteramos de nuevo:
#include <stdio.h>
#include <string.h>

struct {
    char input[5];
    char test[5];
} data;

int main(int argc, char *argv[])
{
    char *new_line_pos;
    int c;

    sprintf(data.test, "uoc");

    do
    {
        printf("Passwd? ");
        fgets(data.input, sizeof data.input, stdin);

        if ((new_line_pos=strchr(data.input, '\n')) != NULL){
            **new_line_pos = '\0';
        }
        else{
            while ((c = getchar()) != '\n' && c != EOF) { }
            continue;
        }
    }
    while (strcmp(data.input, data.test) != 0);

    printf("Passwd OK\n");
    return(0);
}

Debes adecuar el tamaño del array para que pueda contener tanto  \n como  \0 además del tamaño de la clave.

