Q:

¿Como ingresar un string en una fila random dentro de una matriz? en C

Resulta que estoy haciendo un ejercicio de crear una sopa de letras pero me topé con un problema. Resulta que tengo que insertar un string de manera random en una matriz[8][8] (ó puede ser N x N).
Tengo una pseudo idea para generar el random:
fila= rand() % 8;
columna= rand() % 8;

//Para meter el string en una fila.
for(i=0;i<strlen(palabra);i++)
    {
        for(j= fila;j<8;j++)
        {
            for(k=columna; k<8; k++)
            {
                if(i < strlen(palabra))
                {

                    if(palabra[i] == matriz[j][k])
                    {
                        i++;
                        continue;
                    }
                    else
                    {
                        matriz[j][k] = palabra[i];
                        i++;
                    }
                }
                else
                    break;

            }
        }
    }   

Pero mi problema es: ¿Cómo puedo verificar que al generarlo de manera random, no se desborde la matriz con la palabra, dejando alguna letra afuera, o que no haya mas espacio para insertarla?. Tengo unas ideas vagas pero no se me ocurre como llevarlo a código, ¿Cuáles podrían ser algunas alternativas?

A:

¿Cómo puedo verificar que al generarlo de manera random, no se desborde la matriz con la palabra, dejando alguna letra afuera, o que no haya mas espacio para insertarla?.

Tienes dos maneras de aproximarte a este problema:

Elegir posición y dirección de escritura de la palabra, calcular el tamaño disponible, elegir una palabra del tamaño adecuado e insertarla.
Elegir una palabra y su dirección de escritura, buscar una posición compatible con el tamaño de la palabra.

En resumen, o empiezas dese la posición o empiezas desde la palabra.
Primera opción.
Suponiendo una función que recibe la matriz (con su tamaño) y una lista de palabras candidatas, la implementación podría parecerse a:
void pon_palabra(char **matriz, unsigned alto, unsigned ancho, char **palabras)
{
    // Elegimos dirección de escritura
    int DireccionH = (rand() % 2);
    int DireccionV = (rand() % 2);

    // Elegimos la posición, asumiendo que la palabra más corta tiene 3 letras.
    unsigned x = rand() % (ancho - (DireccionH ? 3 : 0));
    unsigned y = rand() % (ancho - (DireccionV ? 3 : 0));

    // Calculamos el espacio disponible:
    unsigned espacio = min(ancho - x, alto - y);

    // Escogemos una palabra:
    char *palabra = palabra_aleatoria_de_n_letras(palabras, espacio);

    // Escribimos la palabra:
    escribe(matriz, alto, ancho, palabra, x, y);
}

Ten en cuenta que el código anterior es una guía, la implementación de palabra_aleatoria_de_n_letras y escribe es cosa tuya, igual que decidir qué hacer cuando DireccionH y DireccionV sean ambas cero.
Segunda opción.
Suponiendo una función que recibe la matriz (con su tamaño) y la palabra a escribir, la implementación podría parecerse a:
void pon_palabra(char **matriz, unsigned alto, unsigned ancho, char *palabra)
{
    // ¿Qué longitud tiene la palabra?
    unsigned longitud = strlen(palabra);

    // Elegimos dirección de escritura
    int DireccionH = (rand() % 2);
    int DireccionV = (rand() % 2);

    // Elegimos la posición, asumiendo que la palabra más corta tiene 3 letras.
    unsigned x = rand() % (ancho - (DireccionH ? longitud : 0));
    unsigned y = rand() % (ancho - (DireccionV ? longitud : 0));

    // Escribimos la palabra:
    escribe(matriz, alto, ancho, palabra, x, y);
}

Ten en cuenta que el código anterior es una guía, la implementación de palabra_aleatoria_de_n_letras y escribe es cosa tuya, igual que decidir qué hacer cuando DireccionH y DireccionV sean ambas cero.

