【发布时间】:2016-03-03 12:38:05
【问题描述】:
我尝试编写一个程序,它从字符串 s1 复制第一个 k 字符,然后将结果与从位置 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.
【问题讨论】:
-
strncpy man page says: "警告:如果 src 的前 n 个字节中没有空字节,则放在 dest 中的字符串不会以空值结尾"。也就是说,如果您的代码中的值
k小于strlen(s1)+1,那么result中的结果内容将不会被NUL 终止。 -
这段代码存在很多问题,比如内存泄漏、
malloc的结果转换(这是一种病)、格式错误。k和i变量的用途是什么?因为它们是造成此问题的主要原因。 -
停止使用
strncpy。请改用snprintf -
char s[lens+1];比所有 malloc 乱码都简单 -
@kaylum 非常感谢你,所以我必须在指令 strncpy 之后添加 result[k]='\0' ?它应该可以正常工作
标签: c string strcpy strcat strncpy