Lo que pasa alli es que scanf lee un entero %d, y una cadena de caracteres %s, que tiene que tener el formato de entrada "entero-cadena caracteres". Scanf espera recibir punteros/direcciones de memoria tengo entendido, por esa razon val si lleva &, pero str no, pues str lo que guarda es la direccion de memoria del primer elemento del arreglo, en otras palabras, es como &str[0].
Entonces, si le ingresamos: 100-hola, 100 se guarda en val, y hola se guarda como 4 caracteres separados desde la posicion 0 hasta la 3 del array.
Entonces, si le ingresamos: 100-hola, 100 se guarda en val, y hola se guarda como 4 caracteres separados desde la posicion 0 hasta la 3 del array.