/etc/shadow update password entry! ( getspent? )

Hi i just whant to update an password entry in /etc/shadow.
But dosen't get it to work. Something is wrong! in this code.

What i try do do is if user kalle exist in shadow.
I whant it to update it's password for just that entry.

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
#include <shadow.h>
//#include <userpw.h>

int main()
{
// -------------------------- //
// ------- passwd file ------ //
// -------------------------- //
FILE* fp;
struct passwd *p;

memset(&p, 0, sizeof(p));

if (!(fp = fopen("/etc/passwd", "a"))) {
perror("Problem ");
return(1);
}

// --------------------------- //
// ----- Password Crypt ------ //
// --------------------------- //
char salt[2];
char password[8] = "password";
char t[11];

salt[0] = 'W'; salt[1] = 'M';
strcpy(t,(char *)crypt(password, salt));

// --------------------------- //
// ------ shadow file -------- //
// --------------------------- //

FILE* fps;
struct spwd *sp;
memset(&sp, 0, sizeof(sp));
if (!(fps = fopen("/etc/shadow", "rw"))) {
perror("Problem");
return(1);
}

char user[20] = "kalle";

/* Loop thru passwd file */
while ((p = getpwent()) != NULL) {
printf("%s\n",p->pw_name);

//IF user found
if (strcmp(p->pw_name, user) == 0 ) {

if(!(sp=getspnam(p->pw_name))){
printf("user missing in shadow file");
} else {
strcpy(sp->sp_pwdp,t);
prinf("run the train %s\n",sp->sp_pwdp);
putspent(sp,fps);
}

}

}

fclose(fps);

return( EXIT_SUCCESS );
}

Now i got a bit thurder. But have a differnet problem.
In end of the shadow file it writes "GjgGToqZ1:14063:0:99999:7:"
dont understand why!

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
#include <shadow.h>
//#include <userpw.h>

int main()
{
// -------------------------- //
// ------- passwd file ------ //
// -------------------------- //
FILE* fp;
struct passwd *p;

 memset\(&p, 0, sizeof\(p\)\);

 if \(!\(fp = fopen\("/etc/passwd", "r"\)\)\) \{
       perror\("Problem "\);
       return\(1\);
 \}

// --------------------------- //
 // ------ shadow file -------- //
 // --------------------------- //

 FILE* fps;

 struct spwd *sp;
 //char currpass[255];
 memset\(&sp, 0, sizeof\(sp\)\);
 //memset\(&currpass, 0, sizeof\(currpass\)\);     
 if \(!\(fps = fopen\("/etc/shadow", "r\+"\)\)\) \{
    perror\("Problem"\);
    return\(1\);
 \}



 char user[20] = "kalle";
 //strcpy\(sp-&gt;sp_pwdp,t\);
 //char password[10] = "password";     

 /* Loop thru passwd file */

    while \(\(sp = getspent\(\)\) != NULL\) \{
            if \(strcmp\(sp-&gt;sp_namp,user\) == 0 \) \{
                    //if\(!\(sp=getspnam\(sp-&gt;sp_namp\)\)\) \{
                    //      printf\("that user does not exist in shadow file\\n"\);
                    //\} else \{
                            strcpy\(sp-&gt;sp_pwdp,"testpass"\);
                            putspent\(sp, fps\);
                    \}

             else \{
                    //strcpy\(sp-&gt;sp_pwdp,"temp"\);
                    putspent\(sp,fps\);
            \}
    \}

fclose(fp);
fclose(fps); return( EXIT_SUCCESS );
}

exit\(0\);

Problem solved!