论坛里有人问,memcpy这个函数.发现自己也没有用过.
尝试下.
//-------------------------
void mem() { char a[]="stringar"; char b[]="asderdfararar"; printf("%s/n",a); printf("%d/n",sizeof(a)); memcpy(a,b,sizeof(b)); printf("%s/n",a); printf("%d/n",sizeof(a)); }
//-----------运行结果:stringar9asderdfararar9//-----------发现a的长度都是9,不再变化.虽然a的数据已经改变了.memcpy(a,b,sizeof(b)); 将b中,sizeof(b)个数据复制到a对应的存储区域.a原来对应的长度为9,但是复制的数据长度超出了原来的长度.运行后会出现错误:a的数据已经被误用了.(越界拷贝)在打印的时候,printf打印string时,是到了结束符就停止.所以会打印出所有的字符.但是sizeof()是怎么计算的了.怎么判断一个变量所对应的长度.如果定义的是一个数组,它的长度一开始就是固定的.那么在运行时就算是改变数据等,它的长度还是原来的常量.//----------函数名: memccpy 功 能: 从源source中拷贝n个字节到目标destin中 用 法: void *memccpy(void *destin, void *source, unsigned char ch,unsigned n);char *src = "This is the source string";
char dest[50];
char *ptr;ptr = (char *)memccpy(dest, src, 'c', strlen(src));
if (ptr)
{
*ptr = '/0';
printf("The character was found: %s/n", dest);
}
else
printf("The character wasn't found/n");运行结果:
The character was found: This is the sourc
呵呵.是到指定的那个字符结束...
//------------------------
原型:char *strtok(char *s, char *delim);
功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
strtok在s中查找包含在delim中的字符并用NULL('')来替换,直到找遍整个字符串。
返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
#include <string.h>
#include <stdio.h>
int main(void)
{
char input[16] = "abc,d";
char *p;
/**/ /* strtok places a NULL terminator
in front of the token, if found */
p = strtok(input, ",");
if (p) printf("%s/n", p);
/**/ /* A second call to strtok using a NULL
as the first parameter returns a pointer
to the character following the token */
p = strtok(NULL, ",");
if (p) printf("%s/n", p);
return 0;
}
函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个 ',' 之前的字符串,也就是上面的程序第一次输出abc。
第二次调用该函数strtok(NULL,"."),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。
strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置
线程安全的函数叫strtok_r,//--------------
使用strtok_r
在这种情况我们应该使用strtok_r, strtok reentrant.
char *strtok_r(char *s, const char *delim, char **ptrptr);