美文网首页
[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