I tried to write a programme which copies the first k char from a string s1 and then concatenates the result with the rest of string s2 starting from a position i then concatenates the rest of s1 in the result. Yet I had some problems with strncpy
. It shows some weird characters in console like @.
Here's my code:
char* strninsert(char *s1, char *s2, int k,int i)
{
int n=strlen(s1)+strlen(s2)+10; // if i put for exemple 1000 it works
char *result=(char*)malloc(n*sizeof(char));
result[0]='\0';
strncpy(result,s1,k);
strcat(result,(s2+i));
strcat(result,(s1+k));
puts(result);
return(result);
}
int main()
{
int lens;
printf("size string 1 ");
scanf("%d",&lens);
char *s=(char*)malloc((lens+1)*sizeof(char));
getchar();
fgets(s,lens+1,stdin);
int lenx;
printf("enter size string 2 ");
getchar();
scanf("%d",&lenx);
char *x=(char*)malloc((lenx+1)*sizeof(char));
getchar();
fgets(x,lenx+1,stdin);
int lentemp=lenx+lens;
char *temp=(char*)malloc((lentemp+1)*sizeof(char));
temp=strninsert(s,x,2,3);
puts(temp);
return(0);
}
It shows me weird characters after the strncpy
instruction like for example poes@<line
.
Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.
That is, if the value k
in your code is less than strlen(s1)+1
then the resulting contents in result
will not be NUL terminated. One possible fix is to change your code thus:
/* Sanity check. */
if (k > strlen(s1)) {
k = strlen(s1);
}
strncpy(result , s1, k);
result[k] = '\0';
Also, not directly related to your problem but you have memory leaks in your code.
temp
variable received a malloc
buffer which is then immediately lost as temp
is overwritten by the strninsert
result. strninsert
is dynamic memory which is not freed anywhere. As previously answered by kaylum, the result of strncpy
is not necessarily a string. This poses a hazard when passing it to strcat
, as strcat
requires that both arguments definitively be a string.
The nicest solution to your problem I can think of involves using sprintf
, like so:
void solution(char *destination, char *x, int x_size, char *y) {
sprintf(destination, "%*.s%s", x_size, x, y);
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.