Vabbé, chiudiamo questa storia che è meglio:
Originariamente inviato da Essio
codice:
main(){
 p[30], q[30], k[30];
       int unisci_stringhe (char s1[] , char s2[] , char s3[]);
       
       /*printf("%d",unisci_stringhe("e arrivato autunno","e il primo giocatore","arrivato primo"));
       system("pause");*/
       
       }
       

int unisci_stringhe (char s1[] , char s2[] , char s3[]){
    int i=0, j=0;
    int p=0 ,k=0 ,z=0;
    int contas1=0 , contas2=0;
    
    while(s1[i]!='\0'){                  
    while(s2[j]!='\0'){
                     while(!contas1==1){
                       if(i>0 && s1[i]==' ' && s1[i-1] !=' ')
                                   {contas1 ++;}
                                   }
                     while(!contas2==2){
                       if(j>0 && s2[j]==' ' && s2[j-1] !=' ')
                                   {contas2 ++;}
                                   }

                       i++;j++;
}
}
 {k=i+1; p=1, z=j+1;
  
         while(s1[i]!=' ' || s1[i]!='\0'){
                  s3[p]=s1[i];
                  k++;
                  p++;}
         while(s2[z]!=' ' || s2[z]!='\0'){
                  s3[p]=s2[z];
                  p++;
                  z++;
                  }
                                                         
}
s3[p+1]='\0';
return p; 

}
Personalmente, ti consiglierei di scrivere una funzione a parte per individuare la parola successiva e una per concatenare una stringa finché non cerca uno spazio. A quel punto il lavoro della unisci_stringhe si riduce al richiamare un paio di funzioni.

Per inciso, il modo in cui hai richiamato unisci_stringhe non va bene, s3 deve essere un buffer scrivibile (e le stringhe literal non sono scrivibili, né ci puoi accedere poi se anche le modifichi).