C语言-字符串处理

  • 字符数组与字符串区别

C语言中没有字符串这种数据类型,可以通过char型数组来替代; 注意:C语言中,字符串一定是一个char型数组,但char型数组未必是字符串;

在C语言的char型数组中,数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char型数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。

  • 字符串的初始化

  char buf[] = { 'a','b','c' };//不指定长度,没有0结束符,有多少个元素就有多长

  char buf2[100] = { 'a','b','c' };//指定长度,后面没有赋值的元素,自动补0

  char buf[1000] = { "hello" };

  char buf3[100] = { 0 }; //所有元素赋值为0

  char *str;//定义一个字符型null指针,使用前需初始化内存

,c++中,字符串指针与c语言中稍有区别,c++中直  接将字符串指针做了增强处理,因为c++中规定字符串指针必须用const修饰,例如在c++中这样定义,编译器会直接报错:

char* str = "hello world";  //直接报错 
const char * str = "hello world";  //正确

c语言中,字符串指针和字符串数组不是一种,只有字符串数组可以被增删改操作

char str[] = "hello world";  //建议使用 
char* str = "hello world";  //不建议使用
  • 字符串处理函数

char *strcpy(char*dest,  char*  source)//字符串拷贝函数

功能:把source所指向的字符串复制到dest所指的空间中,'\0'也会拷贝过去;

返回值:成功返回dest字符串的首地址,失败返回:NULL;

char *strncpy( char*dest,  char*  source )函数,和strcpy()用法基本一样,但是有以下几点需要注意以下:

  1. strncpy遇到’\0’或到达指定长度就停止拷贝,如果src长度小于n,则拷贝到src的最后一位即’\0’为止。
  2. 如果src的前n个字节里没有’\0’则dest将不会以’\0’结尾。
  3. strncpy()相对与strcpy()更安全点儿,即我们可以指定拷贝长度。

char *strcat( char*dest,  char*  source );//字符串拼接函数

功能:把source字符串连接到dest的尾部,'\0'也会追加过去;

返回值:成功返回dest字符串的首地址,失败返回:NULL;

char *strncat( char*dest,  char*  source ,size_t  n);

strncat与strcat用法和功能基本类似,不同的是strncat可以指定连接src字节数。

strcpy,strncpy,strcat,strncat为不安全函数,复制或者连接的时候不会检查被源字符数组的大小,容易造成越界。

复制字符串可采用snprintf.

int snprintf(char *str, size_t size, const char *format, ...)。

功能:

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');

(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。

返回值:成功返回format [, argument, …]的大小,失败返回:-1;

char buf[LEN];
int n = snprintf(buf, LEN, "%s%d%s", str1, int2, str3);
char buf[8];
int n = snprintf(buf, 5, "abcdefghijk");
printf("n %d    buf %s\n", n, buf);
 
运行结果为:
n 11     buf abcd

snprintf会在结尾加上\0,不管buf空间够不够用,所以不必担心缓冲区溢出。

char *strtok(char *str, const char *p);//字符串解析分割函数

功能:以*p为分隔符,若str不为NULL,则查找str的第一个分隔符,将分隔符替换为’\0’,分隔符前的字符串的首地址a和分隔符后的字符串的首地址b赋值给它自己维护的全局变量,并且返回该全局变量的b的地址;
第二次调用时,若str为NULL,那么strtok()查找的起始位置则是自身维护的地址变量,它保存的是上次查找的分隔符后的首个元素的地址。即以*p分割的下一组字符串。

被strtok处理后的字符串本身也会改变;因为它是在原字符串上进行维护的。所以是个线程不安全的函数。

返回值:char型指针,也就是要返回分隔后的字符串;

char *strtok_r(char *str, const char *p, char **saveptr);

功能:与strtok一致

参数3是一个二级指针,也就是存放一级指针的地址。与strtok不同的是,返回的地址值不再是全局变量的地址,而是参数saveptr所指向的空间的地址了,该空间存放的是本次调用后分隔符前的字符串的首地址。注意每次对strtok_r的调用都是针对形参saveptr所指向的字符串。

返回值:char型指针,也就是要返回分隔后的字符串;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值