我试着编写一个程序,它从字符串s1复制第一个k char,然后将结果与从位置i开始的字符串s2的其余部分连接起来
然后在结果中连接s1的其余部分。然而我在strncpy
遇到了一些问题。
它在控制台中显示了一些奇怪的字符,如@。
这是我的代码:
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);
}
它显示了strncpy
指令之后的奇怪字符
poes@<line
。
答案 0 :(得分:6)
警告:如果src的前n个字节中没有空字节,则 放在dest中的字符串不会以空值终止。
也就是说,如果代码中的值k
小于strlen(s1)+1
,则result
中的结果内容将不会终止。一个可能的解决方法是更改您的代码:
/* Sanity check. */
if (k > strlen(s1)) {
k = strlen(s1);
}
strncpy(result , s1, k);
result[k] = '\0';
此外,与您的问题没有直接关系,但您的代码中存在内存泄漏。
temp
变量收到一个malloc
缓冲区,然后在temp
结果覆盖strninsert
后立即丢失。strninsert
的结果是动态内存,不会在任何地方释放。 答案 1 :(得分:0)
正如之前kaylum所回答的那样,strncpy
的结果不一定是字符串。将其传递给strcat
时会造成危险,因为strcat
要求两个参数最终都是字符串。
我能想到的最好的问题解决方案涉及使用sprintf
,如下所示:
void solution(char *destination, char *x, int x_size, char *y) {
sprintf(destination, "%*.s%s", x_size, x, y);
}