C语言学习记录_2019.02.23
- char类型的输出:
scanf(“%d”,&i);//i=49;
char x=i;
printf(“x=%d\n”,x);
printf(“x=’%c’\n”,c);
得到
x=49
x=’1’
即x=49的值,作为整数输出的时候值为49,作为char类型变量的时候,值为1(1的ASCLL码为49),得到‘1’==49,此时1为字符值,49为值;
- scanf(“%d”,x);//从输入里面读入整数;
scanf(”%c”,x);//从输入里面读入字符值(注意为字符值而不是值);
- 空格的ASCLL码为32;
- char类型,字符值的赋值:char = ‘A’;
- 逃逸字符,用来表达无法打印出来的控制字符或特殊字符,由一个反斜杠”\”开头,后面跟上另一个字符,这两个字符组合起来,组成了一个字符,如”\““,可以打印出双引号“ ”“;
- 逃逸字符成员:
\b:回退一格,把下一个输出回到上一个的位置上面去,a\bc--->c;类似Backspace;
\t:到下一个表格位;它不代表固定的字符的数量,而是代表固定的字符的位置,使对齐;类似Tab;
\n:换行;
\r:回车;
\’:单引号;
\”:双引号;
\\:反斜杠本身;
- char word[]={‘H’,’e’,’l’,’l’,’o’,’!’};//字符数组,6个单元;
- char word[]={‘H’,’e’,’l’,’l’,’o’,’!’,’\0’};//字符串,7个单元,最后的0使得成为字符串,可以进行字符串的操作;
- 字符串定义:以零结尾的一串字符,零表示字符串的结束,但它不是字符串的一部分;
- 0和‘\0’是一样的,但是和 ‘0’ 不同;
- 字符串以数组的形式存在,以数组或指针的形式访问;
- 0(占4个字节),而 ‘\0’(占1个字节);
- sting.h中有许多处理字符串的函数;
- 字符串变量定义:
char *str = “Hello”;
char word[] = “Hello”;
char word[10] = “Hello”;//注意里面有包含结尾的0,即字符串长度占了5+1个位置;
- 由双引号”“括起来的叫做字符串的字面量,或者叫做字符串的常量;
- C语言会自动把相邻的两个字符串连接起来成为一个大的字符串;”a“”b“--
-->”ab“;(或者用反斜杠\来表示字符串为写完)(because人的眼睛更容易、倾向于接收窄的内容)(程序员喜欢把屏幕转过来)
- 通过数组的方式可以用来遍历字符串;
- 字符指针类型的字符串,字符指针所指向的字符串的地址和字符指针本身的地址不同,字符指针所指向的字符串的地址位于代码段,此段的代码有只读的保护功能,不能对其进行修改;如:char *s=”Hello”,S为const类型,只读;
- 用指针的方式定义字符串,则不能修改;//char *s=”Hello”;*s地址在别处;
- 用数组的方式定义字符串,则可以修改;//char s[]=”Hello”;s[]地址在本地;
- 数组则本地变量的空间是可以自动回收的,字符串则这个字符串不知道在哪里;
- 指针用处:
(1)用来处理参数,不可修改;
(2)动态分配空间,malloc得到字符串的空间;
- 构造一个字符串:用数组;
- 处理一个字符串:用指针;
- 字符串可以表达为char*形式,char*不一定是字符串,也可能是指向单个字符的指针而已,只有它所指的地方结尾有0,才能说它指的是字符串;
- 字符串赋值?
char *t = “title”;
char *s;
s= t;
并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的操作就是对t的操作;
- 字符串的输入输出:
char string[8];
scanf(“%s”,string);//直到遇到空格、tab或回车为止;
printf(“%s”,string);
- scanf是不安全的,因为不知道要读入的内容的长度;
- 安全的方式:char sting[8]; scanf(“%7s”,string);//告诉编译器最多只能读7个字符,超过7个则不要了;(8-1=7)
- 常见错误:误以为char*是字符串类型;(实际仅仅是定义了1个指针变量)没有对指针进行初始化,char *string;所以不一定每次运行都出错,可能换个电脑就出错了,因为指针指向了有害的内存空间;
- 本地变量没有默认的初始值;
- char buffer[100]=””;------>这是一个空的字符串,buffer[0]== ‘\0’;
- char buffer[]=””;---------->这个数组的长度只有1,即buffer[0]=0;
- #include<string.h>
//常用字符串函数
(1)size_t strlen(const char *s);----返回字符串的长度,不包括结尾的0;(const使函数不修改传进去的数组)
(2)int strcmp(a,b);------比较两个字符串,相等返回0,不相等则返回值的差值;
(3)strcpy(a,b);----------把字符串b的内容拷贝到a里面去;
(4)strcat(a,b);----------把字符串b的内容拷贝到a的后面,接成1个长的字符串,返回a;(要求a的空间足够大)(安全版本:strncat,strncmp,strncpy)
(5)strchr(const char *s,int c);----从左边开始找c第一次出现的位置,返回指针;
(6)strrchr(const char*s,int c);----从右边开始找c第一次出现的位置,返回指针;
- 数组名字实际为数组的地址;因此a==b是false,因为两个数组的地址不同;