版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我们立即下架或删除。
简介:字符串
字符数组
• char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’};
word[0] H
word[1] e
word[2] l
word[3] l
word[4] o
word[5] !
这不是 C语⾔的字符串,因为不能⽤字符串的⽅式做计算
字符串
• char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’,‘!’,’\0’};
word[0] H
word[1] e
word[2] l
word[3] l
word[4] o
word[5] !
word[6] \0
字符串
• 以 0(整数 0)结尾的⼀串字符
• 0或 ’\0’是⼀样的,但是和 ’0’不同
• 0标志字符串的结束,但它不是字符串的⼀部分
• 计算字符串⻓度的时候不包含这个 0
• 字符串以数组的形式存在,以数组或指针的形式访问
• 更多的是以指针的形式
• string.h ⾥有很多处理字符串的函数
字符串变量
• char *str = “Hello”;
• char word[] = “Hello”;
• char line[10] = “Hello”;
字符串常量
• “Hello”
• ″Hello″ 会被编译器变成⼀个字符数组放在某处,这
个数组的⻓度是 6,结尾还有表⽰结束的 0
• 两个相邻的字符串常量会被⾃动连接起来
• ⾏末的 \表⽰下⼀⾏还是这个字符串常量
字符串
• C语⾔的字符串是以字符数组的形态存在的
• 不能⽤运算符对字符串做运算
• 通过数组的⽅式可以遍历字符串
• 唯⼀特殊的地⽅是字符串字⾯量可以⽤来初始化字符
数组
• 以及标准库提供了⼀系列字符串函数
字符串常量
char* s = "Hello, world!";
• s 是⼀个指针,初始化为指向⼀个字符串常量
• 由于这个常量所在的地⽅,所以实际上 s是 const
char* s ,但是由于历史的原因,编译器接受不带
const的写法
• 但是试图对 s所指的字符串做写⼊会导致严重的后果
• 如 果需要修改字符串,应该⽤数组:
char s[] = "Hello, world!";
指针还是数组?
• char *str = “Hello”;
• char word[] = “Hello”;
• 数组:这个字符串在这⾥
• 作为本地变量空间⾃动被回收
• 指针:这个字符串不知道在哪⾥
• 处理参数
• 动态分配空间
• 如果要构造⼀个字符串 —>数组
• 如果要处理⼀个字符串 —>指针
char*是字符串?
• 字符串可以表达为 char*的形式
• char*不⼀定是字符串
• 本意是指向字符的指针,可能指向的是字符
的数组(就像 int*⼀样)
• 只有它所指的字符数组有结尾的 0,才能说它
所指的是字符串
字符串运算
字符串赋值?
• char *t = “title”;
• char *s;
• s = t;
• 并没有产⽣新的字符串,只是让指针 s指向了 t
所指的字符串,对 s的任何操作就是对 t做的
字符串输⼊ 输出
• char string[8];
• scanf(“%s”, string);
• printf(“%s”, string);
• scanf读⼊⼀个单词(到空格、 tab或回⻋为⽌)
• scanf是不安全的,因为不知道要读⼊的内容的⻓度
安全的输⼊
• char string[8];
• scanf(“%7s”, string);
• 在 %和 s之间的数字表⽰最多允许读⼊的字符的数
量,这个数字应该⽐数组的⼤⼩⼩⼀
• 下⼀次 scanf从哪⾥开始?
常⻅错误
• char *string;
• scanf(“%s”, string);
• 以为 char*是字符串类型,定义了⼀个字符串类型的
变量 string就可以直接使⽤了
• 由于没有对 string初始化为 0,所以不⼀定每次运⾏
都出错
空字符串
• char buffer[100]=””;
• 这是⼀个空的字符串, buffer[0] == ‘\0’
• char buffer[] = “”;
• 这个数组的⻓度只有 1!
字符串数组
• char **a
• a是⼀个指针,指向另⼀个指针,那个指针指向⼀个字符(串)
• char a[][]
• a是⼀个⼆维数组,第⼆个维度的⼤⼩不知道,不能编译
• char a[][10]
• a是⼀个⼆维数组, a[x]是⼀个 char[10]
• char *a[]
• a是⼀个⼀维数组, a[x]是⼀个 char*
printf("请输⼊⽉份: ");
int month;
scanf("%d", &month);
switch ( month ) {
case 1: printf("January\n"); break;
case 2: printf("February\n"); break;
case 3: printf("March\n"); break;
case 4: printf("April\n"); break;
case 5: printf("May\n"); break;
case 6: printf("June\n"); break;
case 7: printf("July\n"); break;
case 8: printf("August\n"); break;
case 9: printf("September\n"); break;
case 10:printf("October\n"); break;
case 11:printf("November\n"); break;
case 12:printf("December\n"); break;
}
今后可以⽤数组来做
程序参数
• int main(int argc, char const *argv[])
• argv[0]是命令本⾝
• 当使⽤ Unix的符号链接时,反映符号链接的名字 更多>>