原型:extern char *strncpy(char *dest, char *src, int n);
创新互联建站主要从事成都网站制作、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务水城,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
用法:#include string.h
功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
举例:
// strncpy.c
#include syslib.h
#include string.h
main()
{
char *s="Golden Global View";
char *d="Hello, GGV Programmers";
char *p=strdup(s);
clrscr();
textmode(0x00); // enable 6 lines mode
strncpy(d,s,strlen(s));
printf("%s\n",d);
strncpy(p,s,strlen(d));
printf("%s",p);
getchar();
return 0;
}
原型:char * strncpy(char *dest, char *src, size_t n); 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL就开始复制,而是等凑够n个字符才开始复制),返回指向dest的指针。 说明: 如果n dest串长度,dest栈空间溢出产生崩溃异常。 否则: 1)src串长度=dest串长度,(这里的串长度包含串尾NULL字符) 如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。 如果n = src串长度,与strcpy一致。 如果n = dest串长度,[0,src串长度]处存放src字串,(src串长度, dest串长度]处存放NULL。 2)src串长度dest串长度 如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。 综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况下的输出乱码问题。当然喽,无论是strcpy还是strncpy,保证src串长度dest串长度才是最重要的。
因为字符串需结束符,该程序没给b加结束符,所以导致乱码,完整的程序如下:
#include stdio.h
#include string.h
#include stdlib.h
main()
{
char a[]="uewreuwiurweu";
char b[100];
strncpy(b,a,1);
b[1]='\0';
puts(b);
system("pause");
}
截断一个数组的一部分相当于取得一个数组的某一个子集数组。
如果是字符数组,可以使用strncpy函数,根据需要截取需要部分。
strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *dest, char *src, int n),把src所指字符串的前n个字节复制到dest所指的数组中,并返回指向dest的指针。
如果是普通数组,使用循环语句,将需要的部分一一赋值即可。
例如:
#includestdio.h
int a[10]={0,1,2,3,4,5,6,7,8,9};//源数组a
int b[10],i;//子集数组b
int main(){
for(i=5;i10;i++) b[i-5]=a[i]; //获得a数组中第6个到第10个数,储存到b当中
return 0;
}
首先打印出乱码, 肯定是读错了内存导致的, 一般输出字符串都以'\0'为结束符,打印出了乱码肯定你打印的字符串没有在结尾添加结束符导致的...
其次应该知道, strncpy函数, 当拷贝的字节数N小于原字符串的长度时, 是不会把最后的字符串结尾符'\0'考到目标空间的, 所以你需要手动的在目标串的最后添加一个字符串结束符'\0', 也就是
ch1[len - 1] = '\0';(strcpy函数是会吧字符串最后的结束符'\0'考到目标串中的)
当然, 把ch1数组元素全部初始化为'\0'也是个比较好的习惯...
代码可以如下修改:
#includestdio.h
#includestring.h
int main()
{
char ch[10], ch1[10];
gets(ch);
int len = strlen(ch);
strncpy(ch1,ch+1 ,len - 1);
ch1[len - 1] = '\0';//加上这句
puts(ch1);
printf("%d\n",strlen(ch1));
puts(ch);
}
代码如下
char* strncpy(char* dest, const char* src, int len)
{
assert(dest!=NULL src!=NULL);
char* temp=dest;
int i=0;
while(i++ len (*temp++ = *src++)!='\0')
{}
if(*(temp)!='\0')
*temp='\0';
return dest;
}