一、字符
ascii码:计算机不能直接存储字符,使用一个编码方式,将字符和整数
一一对应。比如:‘a’ - ‘z’ 97 ~ 122,‘A’- ‘Z’ 65 ~ 90,‘0’- ‘9’ 48 ~ 57
二、字符串
1.C语言字符串
使用“”括起来的式子。“zhangsan”字符串,本质为一个常量,存放在常量区。字符串的值,为这个字符串的首地址。
2.C语言中字符串的引用。
2.1.字符串与字符数组:
我们可以利用字符数组存放字符串,C语言允许像下面这样将字符串,作为初始值赋给字符数组变量:char ch[] = “abcde”;
等价于:char ch[] = {‘a’,’b’,’c’,’d’,’e’,’\0’}; //6B,
但却不等价于:char ch[] = {‘a’,’b’,’c’,’d’,’e’}; //5B.
【注】
对字符数组进行字符串赋值需注意:
1、字符数组大小必须定义足够大,因此字符串的长度必须小于字符数组的大小;
字符数组的长度 >= 字符串的有效长度 + 1
char ch[9] = “zhangsan”;
//字符数组的大小 >= 9
2、如果在定义时没有字符数组进行初始化,那么之后只能对其元素进行逐个赋值;
char ch[] = “zhangsan”; //正确的
char ch[10];
ch = “zhangsan”; //错误的
//ch 是一个指针常量,不能被赋值。
2.2字符串与指针变量
char *p = “zhangsan”;将”zhangsan”的首地址,赋值给了p变量。p指针所指向的字符串,仍然是一个常量。
字符串数组保存和指针变量保存:
访问字符串中的字符,访问方式一样。
char ch[] = “zhangsan”;
char *p = “zhangsan”;
1、下标法
元素:ch[i] p[i]
指针:&ch[i] &p[i]
2、指针偏移法。
元素: *(ch + i) *(p + i)
指针 ch + i p + i
字符串数组保存和指针变量保存区别:
char name[] = “zhangsan”; //可变的字符串,存放在栈区
char *p = “zhangsan”; //不可变的字符串,存放在常量区
name[0] = ‘a’; //正确的 “ahangsan”
p[0] = ‘m’; //错误的
【注】
在C语言中没有专门的字符串变量,如果想将一个字符串存放在变量中以便保存,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。例如 char ch[] = “welcome”;
三.字符串操作
1.字符串的输入输出
1.1 字符串的输入函数
1) scanf
%s
scanf(“%s”, str);
(1) 以回车、空格、制表符作为输入结束的标志。
(2) 不会接受(1)里面的输入结束标志符。
(3) 会在输入字符串的末尾 + \0.
%[^\n]
(1) 除了 \n,不读,读取其他的字符,只会以 \n 作为结束的标志;
(2) 不会读取 \n,会在字符串的末尾 + \0.
【scanf输入字符串的缺陷】:不会检查输入字符串的长度,可能会存在越 界,导致系统崩毁。
1.2 字符串的输出
1) printf
函数原型:
int printf(“%s\n”, char *str);
int printf(“hello world”);
int printf(“%s\n”, “hello world”);
函数参数:
“%s”: 字符串的格式化符。
char *str: 字符串的首地址
返回值:
int : 输出的字符串的有效长度。
2) puts
函数原型:
int puts(const char *s);
函数参数:
const char *s: 输出字符串的首地址;
返回值: 输出是否正常的标志,整数:输出正常。
【值】:puts输出字符串之后,会自动换行。