C语言字符串操作

C字符串

C字符串声明

C中字符串有字符串常量,char数组,char指针

字符串常量

双引号中的所有字符,编译器自动在后面加上''作为结束标志,作为一个字符串储存在内存中。

char str[] = "aa" "bb""cc";

等价于

char str[] = "aabbcc";

字符串常量属于静态储存类。

字符串数组

char str[40] = "hello, world!";

定义字符串数组时必须指定数组大小,指定大小时,要至少多一个,给””留空间,后面的空间将使用''填满。
不指定大小的时候,也就是

char str[] = {'a','b',''};

一定记得后面加个'',不然就只是个字符数组而非字符串。

char指针定义字符串

char *m = "Hello World!"; //将自动添加''

不能用*(m+1) = 'o'来修改,因为这个字符串在常量区。

数组形式和指针形式有什么不同呢?

数组形式:char m[40] = "hello, world!";
数组名m是与数组的首元素&m[0]的同义词,m是个地址常量,可以用m+1来表示数组里的下一个元素,但不能使用++m,增量运算符只能在变量前使用。
指针形式:char *m = "hello, world!";
可以使用++m来指向第二个字符,也就是它是个变量。

字符串操作

以下来自<string.h>

_s的一般是更安全的版本,不带的就是少了个参数而已。

strcpy_s(str1,20,str2);

str2复制到str1里面,最多20位。

strncpy_s(str1, 20, str2, 1);

这个是将str2的一部分复制到str1里面,最多20位。

strcat_s(str1, 20, str2);

这个是将str2附加到str1里面,附加后的总长不超过20位
strncat_s也是一个道理,只不过附加的位数可以控制。

int l = strlen(str1);

字符串长度,对结尾是的字符串是适用的,但结尾若不是就不好使了,也就是,未以结尾的字符数组是不适用的。

int l = strnlen(str1, 2);
int l = strnlen_s(str1, 2);

这个就是解决了上面问题的安全的版本,但是这两个没看出什么区别来,函数原型是一模一样的。

int l = strcmp(str1, str2);

比较字符串,按ASCII比较,str1 == str2返回0,str1 < str2返回-1,str1 > str2返回1.
还有类似的

int l = strncmp(str1, str2, 2);

比较指定长度的字符串。

char* c = strchr(str1, 'a');
char* c = strrchr(str1, 'a'); //反向查找

C里面还有这么好用的东西,搜索字符,搜到了给指针,搜不到是null

char *c = strstr(str1, str4);

查找子字符串,注意str4也是要有的,不然不行(大概会越界就查不到了)。

char *c = strpbrk(str1, "hhcc");

依次检查str1中的字符,若在后面的字符集合中出现则返回指针,若检查完了都没有,则返回null,其实也就是检查两个字符串是否有重合?

int l = strspn(str1, "aaaaadbc");

这个有点复杂,这个是说,在str1中第几个开始不是后面目标字符串中的字符,也就是说,返回的是多少,就说明在str1中,从开头开始连续几个字符串都是后面里面的。

int l = strcspn(str1, "aaaaadbc");

与刚刚的那个恰好相反,这个是属于。

以下来自<stdlib.h>

double d = strtod("   -222.22kkk", &endptr);

字符串转double后面有什么无所谓,但是数字前面除了空格和正负号不能有其他东西。若那个endptr != null,会将遇到非数字终止的字符指针放在里面返回。

long int d = strtol("45455555555555544sss", &endptr, 0);

基本上跟上面那个差不多,不过这个是long int,第三个参数是进制,可以取2-36,如果设置为0,那么默认为10进制,遇到开头0x则16进制,遇到开头0第二位不是x的就8进制。测试的时候用了1,程序直接崩溃……
long int的占位符是%ld

int d = atoi("   21212.22");

ascii to integer,字符串转整数。还有atof()atol,我就不测试了。

原文地址:https://www.cnblogs.com/ippfcox/p/7151350.html