[C补充]memcpy strtok(分割)

本文详细介绍了C语言中的字符串操作函数,包括memcpy与memccpy的功能及使用方法,以及strtok和strtok_r如何用于字符串分割。通过示例展示了如何正确使用这些函数避免内存越界等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论坛里有人问,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));
 }
//-----------
运行结果:
stringar
9
asderdfararar
9
//-----------
发现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);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值