(Suponiendo que usuari apunta a una zona de memoria válida...)
El único fallo que veo es que nunca compruebas el '\0'. Te recuerdo que el terminador de una cadena no es '\n' sino '\0' y deberías comprobarle siempre, aparte de los demás que necesites.
Por cierto, haces algo extraño... ¿No es mejor simplificar así?
for(int i=9, int j=0;i<19&&buffer[i]!='\n'&&buffer[i]!='\0';i++,j++) usuari[j]=buffer[i];
O sin la j:
for(int i=9;i<19&&buffer[i]!='\n'&&buffer[i]!='\0';i++) usuari[i-9]=buffer[i];
O mejor aún:
int i=9;
while(i<19&&buffer[i]!='\n'&&buffer[i]!='\0') usuari[i-9]=buffer[i];
O incluso si quieres hacer el bobo todavía más:
int i=9;
while(i++<19&&buffer[i]!='\n'&&(usuari[i-9]=buffer[i])!='\0'); **
** Eso del ++ dentro puede no funcionar igual en los distintos compiladores, hay que tener cuidado.
Para que luego digan que sólo Perl tiene distintas maneras de hace runa misma cosa
![Riendo](http://static.forosdelweb.com/fdwtheme/images/smilies/risa.png)
.