学习笔记
《深入理解C指针》
http://www.ituring.com.cn/book/1147
第5章 指针与字符串
一、字符串基础
- 字符串的长度是字符串中除了
NUL
(即\0
)字符之外的字符个数
警告 记住,
NULL
和NUL
不同。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");
}
-
globalHeader
,globalArrayHeader
: 分配在全局内存的字符串会一直存在,也可以被多个函数访问; -
staticHeader
、staticArrayHeader
: 静态字符串也一直存在,不过只有定义它们的函数才能访问; -
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
,会试图去这个内存地址查找数据,因为根本不知道这里允不允许访问,也不知道这里存的是什么,就会得到一个运行时错误
网友评论