You're missing a null character to terminate the string. From Wikipedia's article on strncpy.
strncpy writes exactly the given number of bytes, either only copying the start of the string if it is too long, or adding zeros to the end of the copy to fill the buffer. It was introduced into the C library to deal with fixed-length name fields in structures such as directory entries. Despite its name it is not a bounded version of strcpy, it does not guarantee that the result is a null-terminated string. The name of the function is misleading because strncat and snprintf are respectively bounded versions of strcat and sprintf.
Adding the null character makes your program work:
strncpy(rr, p1, nlen);
*(rr+nlen) = '\0'; // this line
printf("%s\n", rr);
I think your code could have a risk of a buffer overflow because nlen
could in theory be greater than 200. Though this is not an issue in the program in your question because the input string is so short.
You might also want to look at strncat which can be used to copy a string including the null character.
An alternative from the standard C library that will always append one null byte is to use strncat with an initially empty string as the destination.