-
字符数组与字符串区别
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()用法基本一样,但是有以下几点需要注意以下:
- strncpy遇到’\0’或到达指定长度就停止拷贝,如果src长度小于n,则拷贝到src的最后一位即’\0’为止。
- 如果src的前n个字节里没有’\0’则dest将不会以’\0’结尾。
- 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型指针,也就是要返回分隔后的字符串;