zoukankan      html  css  js  c++  java
  • 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,我就不测试了。

  • 相关阅读:
    MySQL的图形化安装
    java笔记整理
    运动会报名系统的简易实现
    JDBC知识点总结
    MySQL常用知识总结
    python的传参数用法
    R统计数据框的行数
    SAINT学习笔记
    win10 双网卡设置内网和外网同时访问
    根据GSVA结果绘制不同组的趋势图
  • 原文地址:https://www.cnblogs.com/ippfcox/p/7151350.html
Copyright © 2011-2022 走看看