zoukankan      html  css  js  c++  java
  • Linux C编程学习6---字符串处理、数据转换

    1.字符串
      应用程序按其功能可分为数值计算、非数值计算以及输入输出操作等。非数值计算程序占相当大的比例,其核心就是字符串处理
    1.1.字符测试
      1.1.1.测试字符是否为英文字母
        int isalpha(int c)。若c为英文字母,则返回非零值,否则返回值为0
      1.1.2.测试字符是否为数字
        int isdigit(int c)。若c为数字,则返回非零值,否则返回值为0
    1.2.字符串初始化
      在C语言中,字符串被当做字符数组来处理,对应于内存中的一块连续的区域
      可以使用 void *memset(void *buffer, int c, int count)来对这块连续的内存初始化
        buffer是指针,指向我们要初始化的连续内存的首地址
        参数c,是用来说明将这块内存都初始化为哪个字符,若c为0的话,就是将这块内存清零
        参数count,设置的内存的字节数
      例子

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    char s[]="hello world";
    printf("%s
    ", s);
    memset(s, 'H', 5);
    printf("%s
    ", s);
    return 0;
    }
    

      输出结果是:

        hello world
        HHHHH world
    1.3.字符串的复制
      1.3.1. char *strcpy(char *dest, char *src)
        将src指向的字符串,复制给dest所指向的内存。
        注意:这两个参数所指向的内存区域是不允许重叠的
        函数的返回值是指向 dest的指针
      1.3.2. char *strdup(char *s)
        函数的返回值是指向被复制的字符串的指针,所指向的内存区域是系统自动分配的
      1.3.3. void *memcpy(void *dest, void *src, unsigned int count)
        将参数src所指向的内存区域复制count个字节到dest所指向的内存区域
        这两个指针所指向的内存区域也是不可以重叠的
        函数的返回值是指向 dest的指针
        和strcpy 的不同之处在于:memcpy给源内存和目标内存的指针之后,复制指定大小(unsigned int count)的内存,而不检查内存中的具体内容,包括字符串的结束符,而前面的strcpy 函数是一旦遇到字符串的结束符则立即停止复制
        所以 memcpy并没有将参数当做字符串来看待
      1.3.4. void *memmove(void *dest, const void *src, size_t n)
        将参数src所指向的内存区域复制n 个字节到dest所指向的内存区域
        和strcpy、memcpy不同的是这两个指针所指向的内存区域是可以重叠的
        例子

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    char s[] = "Linux C Programming";
    printf("%s
    ", s);
    memmove(s, s+6, strlen(s)-6);
    s[strlen(s)-6] = '';
    printf("%s
    ", s);
    return 0;
    }
    

        输出结果是

          Linux C Programming
          C Programming
    1.4.字符串的比较
      1.4.1. int strcmp(const char *s1, const char *s2)
        比较参数s1 和 s2所指向的字符串,比较的依据是字符的ASCII码的值,首先将s1的第一个字符减去s2 的第一个字符,如果相同则继续比较第二个字符,如此往后比较。如果字符串相同,则返回值为0,如果不相同,则返回不相同出的字符的ASCII码的差值
      1.4.2. int strncmp(const char *s1, const char * s2, size_t n)
        比较s1 和s2 所指向的字符串的前 n个字节
      1.4.3. int strcasecmp(const char *s1, const char *s2)
        类似于 strcmp,但是在比较的过程中是忽略大小写的
      1.4.4. int strncasecmp(const char *s1, const char *s2, size_t n);
        类似于 strncmp,但是在比较的过程中是忽略大小写的
      1.4.5. int memcmp(const void *s1, const void *s2, size_t n)
        比较s1 和s2 所指向的内存空间的前 n个字节,但是它在比较时候,并不是将 s1 和s2 当做字符串的,并不会考虑内存区域中的字符串结束符
    1.5.字符/字符串查找
      1.5.1. char *index(const char *s, int c)
        在参数s1 做指向的字符串中,从前往后查找字符c,如果找到c 第一次出现的位置,就返回指向这个位置的指针,如果找不到这个字符,就返回 null
        例子

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    char s[] = "hello world";
    char *p;
    p = index(s, 'w');
    printf("%s
    ", p);
    return 0;
    }
    

        输出结果是

          world
      1.5.2. char *rindex(const char *s, int c)
        和 index 类似,不过是从后往前查找
      1.5.3. char *strchr(const char *s, int c)
        和 index 类似,但是不能查找 ''这个字符。可以用 index(s, '')的形式,但是不能用 strchr(s, '')
      1.5.4. char strrctr(const char *s, int c)
        和 rindex 类似,但是不能查找 ''这个字符。可以用 rindex(s, '')的形式,但是不能用 strrchr(s, '')
      1.5.5. char *strstr(const char *haystack, const char *needle)
        在字符串haystack中查找字符串needle,并返回第一次出现的位置,如果没有找到就返回一个空指针
    1.6.字符串连接分割
      1.6.1. char *strcat(char *dest, const char *src)
        将 src所指向的字符串连接到 dest所指向的字符串,返回目标指针的起始地址
        注意,目标字符串必须有足够的缓冲区,否则会发生溢出
        例子

    #include<stdio.h>
    #include<string.h>
    #define BUFFER_SIZE 64
    int main()
    {
    char s[BUFFER_SIZE] = "orld;
    char d[BUFFER_SIZE] = "hello w";
    strcat(d, s);
    printf("%s
    ", s);
    printf("%s
    ", d);
    return 0;
    }
    

        输出结果是

          orld
          hello world
      1.6.2. char *strncat(char *dest, const char *src, size_t n)
        从src 取出n 个字节,连接到dest 所指向的字符串。
        如果src的前n 个字节中没有出现'',那么会在结尾处自动添加一个''
      1.6.3. char *strtok(char *str, const char *delim)
        将 str字符串使用 delim这个分割符号来进行分割。如果在字符串str 找到任何一个分隔符则将其更改为字符串的结束符
        例子

    #include<strio.h>
    #include<string.h>
    int main()
    {
    char str[] = "Linux C Programming";
    char *p;
    p = strtok(str, " ");
    while(p != NULL)
    {
    printf("%s
    ", p);
    p = strtok(NULL, " ");
    }
    printf("str : "%s
    ", str);
    return 0;
    }
    

        输出结果是

          C
          Programming
          str : Linux

    2.数据转换
      数据转换包括英文字母大小写之间的转换、字符串与整数、浮点数之间的转换
    2.1.字母大小写转换
      int toupper(int c) 将小写英文字母转换为大写,如果 c是小写字母则返回对应的大写字母,否则返回原来的值
      int tolower(int c) 将大写英文字母转换为小写,原理类似上面的那个
    2.2.字符串转换
      实现字符串与整数、浮点数之间转换
      2.2.1. 将字符串转换为整数
        int atoi(const char *nptr)
        long atol(const char * nptr)
          这两个函数首先对字符串进行扫描,直到出现数字或者正负号才开始转换,然后再出现非数字或者字符串结束符就停止转换并将结果返回
          只能转换10进制的字符串
          例子

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    char a[] = "-100";
    char b[] = "0x20";
    int c;
    c = atoi(a) + atoi(b);
    printf("c = %d
    ", c);
    return 0;
    }
    

        输出结果是

          -100
        因为,将a转换为 -100,而b是0x20,转换时,先将0转换为0,遇到x就停止转换
      2.2.2. 将字符串转换为浮点数
        double atof(const char *nptr)
        函数首先对字符串进行扫描,直到出现数字或者正负号才开始转换,然后再出现非数字或者字符串结束符就停止转换并将结果返回
        这个函数中,字符串可以包含+、-、小数点、E、e(E、e表示浮点数的指数部分)
      2.2.3. 将浮点数转换为字符串
        char *gcvt(double number, size_t ndigits, char *buf)
        第一个参数是要转换的浮点数
        第二个参数是要显示的位数
        第三个参数是用来存放最终结果的一个缓冲区

  • 相关阅读:
    Java Arrays.asList注意事项
    从给定的N个正数中选取若干个数之和最接近M
    java 8 foreach获取索引
    更优雅地关闭资源
    idea 下获取路径下文件的方法
    IDEA类和方法注释模板设置(非常详细)
    503 Error: need EHLO and AUTH first
    fatal error C1083: Cannot open include file: 'openssl/opensslv.h'
    'pip' 不是内部或外部命令
    JS中every()和some()的用法
  • 原文地址:https://www.cnblogs.com/xumenger/p/4526190.html
Copyright © 2011-2022 走看看