美文网首页
[C指针]指针与字符串:声明、初始化、比较strcmp、复制st

[C指针]指针与字符串:声明、初始化、比较strcmp、复制st

作者: AkuRinbu | 来源:发表于2019-04-14 16:11 被阅读0次

    学习笔记

    《深入理解C指针》
    http://www.ituring.com.cn/book/1147
    第5章 指针与字符串

    一、字符串基础

    • 字符串的长度是字符串中除了NUL(即 \0)字符之外的字符个数

    警告 记住,NULLNUL不同。NULL用来表示特殊的指针,通常定义为((void*)0),而NUL是一个char,定义为\0,两者不能混用。

    • char的长度是1,而字符字面量的长度是 4
      char的长度是1,而字符字面量的长度是 4

    字符串位置小结

    char* globalHeader = "Chapter";
    char globalArrayHeader[] = "Chapter";
    
    void displayHeader() {
        static char* staticHeader = "Chapter";
        char* localHeader = "Chapter";
        static char staticArrayHeader[] = "Chapter";
        char localArrayHeader[] = "Chapter";
        char* heapHeader = (char*)malloc(strlen("Chapter")+1);
        strcpy(heapHeader,"Chapter");
    }
    
    • globalHeaderglobalArrayHeader : 分配在全局内存的字符串会一直存在,也可以被多个函数访问;
    • staticHeaderstaticArrayHeader : 静态字符串也一直存在,不过只有定义它们的函数才能访问;
    • heapHeader : 分配在上的内存在释放之前会一直存在,也可以被多个函数访问;

    二、字符串操作

    1、字符串比较 strcmp

    int strcmp(const char *s1, const char *s2);

    字符串比较
    • 典型错误:使用相等操作符

    相等操作符比较的是地址,而不是地址中的内容,用数组名字或者字符串字面量就会返回地址

    • 编译器相关
      VS里面要使用 scanf_s,并且这个函数需要传入三个参数

    关于VS2017中C语言的关于输入scanf输入字符串的问题
    https://blog.csdn.net/Aki_long/article/details/86708155

    2、复制字符串 strcpy

    char* strcpy(char *s1, const char *s2);

    names[count] = (char*)malloc(strlen(name)+1);
    strcpy(names[count],name);

    复制字符串
    • 典型错误:names[count] = buff
      错误在于,只是复制了buff的地址
      错误在于,只是复制了buff的地址

    3、拼接字符串 strcat

    char *strcat(char *s1, const char *s2);

    • 需要为拼接后的字符串,专门分配独立的内存char* buffer =(char*)malloc(strlen(error)+strlen(errorMessage)+1);,不然可能会覆写第二个字符串
      拼接字符串 strcat

    一个难以察觉的小错误

    正确的 currentPath = strcat(currentPath,"\\");
    错误的 currentPath = strcat(path,'\\');

    • 首先,回顾一下strcat的定义,第二个参数类型要求是 const char *(即一个指向char类型变量的地址)
    • 然后,反斜杠是 \,加上转义字符就是\\,无论如何这都只是一个ASCII字符,也就是在C语言中本质只是一个小小的整数,十进制值92,十六进制值 0x5C
    • 因此,当使用错误写法时,就会将92解读成地址0x5c,会试图去这个内存地址查找数据,因为根本不知道这里允不允许访问,也不知道这里存的是什么,就会得到一个运行时错误
    错误的 currentPath = strcat(path,'\');

    相关文章

      网友评论

          本文标题:[C指针]指针与字符串:声明、初始化、比较strcmp、复制st

          本文链接:https://www.haomeiwen.com/subject/iewjwqtx.html