C语言高级编程(第四部分) 字符串 北京大学 信息科学技术学院.

Slides:



Advertisements
Similar presentations
只怕有心人只怕有心人 世上无难事世上无难事 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作.
Advertisements

电子成绩单项目实现.
二级指针与二维数组.
C语言程序设计基础 第10章 指针进阶 刘新国.
第九章 字串 (String).
補充: Input from a text file
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第九章 字符串.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
第一章 程序设计入门.
第六章 数 组 主讲教师 贾月乐 联系电话:
高级语言程序设计 主讲人:陈玉华.
程序设计II 第三讲 字符串处理.
目录 第八章 数组 1 简单学生成绩管理系统的开发 2 一维数组 3 多维数组 4 字符数组 5 数组作函数参数.
C常用函数 输入输出 stdio.h 字符串处理 string.h 工具函数 stdlib.h 数学函数 math.h
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
第6章 利用数组处理批量数据.
Introduction to the C Programming Language
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
Chap 8 指针 8.1 寻找保险箱密码 8.2 狸猫换太子 8.3 冒泡排序 8.4 加密变换问题 8.5 任意个整数求和问题*
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
二维数组的指针表示 与复杂的指针例子 专题研讨课之三.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
C语言 程序设计基础与试验 刘新国、2012年秋.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
字符串和字符数组 字符串的输入和输出 字符串的基本操作
函 数 实验八 第24讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
第四章 数组 4.4.1一维数组的定义和初始化 一、一维数组的定义和初始化 1.一维数组定义 定义格式:类型 数组名[常量表达式];
第三章 顺序结构程序设计 主讲教师 贾月乐 电话:
第五章 习题课 电子信息与计算机科学系 曾庆尚.
数组 梁春燕 华电信息管理教研室.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++大学基础教程 第5章 数组 北京科技大学 信息基础科学系.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
|09 陣列.
C语言概述 第一章.
第七章 数组.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C语言大学实用教程 第6章 数组 西南财经大学经济信息工程学院 刘家芬
函式庫補充資料.
第六章 数组.
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
C语言程序设计 李祥 QQ:
C程序设计.
第4章 数 组.
第九章 指针.
第九节 赋值运算符和赋值表达式.
第二章 类型、对象、运算符和表达式.
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
C程序设计.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
本节内容 指针类型.
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
第四章 串 String
C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Introduction to the C Programming Language
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
C 程式設計— 字元與字串 台大資訊工程學系 資訊系統訓練班.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
台大資訊工程學系 資料系統訓練班 第119期 吳晉賢
Presentation transcript:

C语言高级编程(第四部分) 字符串 北京大学 信息科学技术学院

数组 的 存储方式

数组 的 存储方式 int shuzu[5]; 数组包含的一组变量 在 内存 中 是 连续存放 的 shuzu[0] shuzu[1]

关于 数组名称 的说明

shuzu shuzu[0] shuzu[1] shuzu[2] shuzu[3] shuzu[4] int main(){ 内存 shuzu[0] shuzu[1] shuzu[2] shuzu[3] shuzu[4] int main(){ int shuzu[5]; if(shuzu == &(shuzu[0])){ printf("True\n"); }else{ printf("False\n"); } return 0; shuzu

数组名称 是 一个地址 数组名称 是 shuzu shuzu[0] shuzu[1] shuzu[2] 该数组所占内存空间的起始地 址,是数组第一个元素的地址。

数组名 与 指针变量 静态数组: 动态数组: 静态数组和动态数组在内存中的本质是一样的,可以用指针变量来代表数组名: 数组名是一个指向该数组所占内存空间的地址。 动态数组: 通过指针变量,指向一块自己申请的内存空间,这块空间也是一个数组。 静态数组和动态数组在内存中的本质是一样的,可以用指针变量来代表数组名: #include <stdio.h> #define N 10 int main(){ int i; int distance[N]; for( i=0; i<N; i++){ scanf(“%d”, &distance[i]); } return 0; #include <stdio.h> #define N 10 int main(){ int i; int distance[N]; int *pint; pint = distance; for( i=0; i<N; i++){ scanf(“%d”, &pint[i]); } return 0;

数组元素 的 赋值 声明后 赋值 声明时 赋值

声明后 赋值 int shuzu[5]; 内存 随机值 shuzu[0] shuzu[1] shuzu[2] shuzu[3]

声明后 赋值 int shuzu[5]; int i; for(i = 0; i < 5; i++){ shuzu[i] = i; } 内存 声明后 赋值 shuzu[0] shuzu[1] shuzu[2] shuzu[3] shuzu[4] 随机值 int shuzu[5]; int i; for(i = 0; i < 5; i++){ shuzu[i] = i; }

声明后 赋值 int shuzu[5]; 1 int i; for(i = 0; i < 5; i++){ 2 内存 声明后 赋值 shuzu[0] shuzu[1] shuzu[2] shuzu[3] shuzu[4] 1 2 3 4 int shuzu[5]; int i; for(i = 0; i < 5; i++){ shuzu[i] = i; }

声明时 赋值 1 2 3 4 int shuzu[5] = {0, 1, 2, 3, 4}; 内存 shuzu[0] shuzu[1] 1 2 3 4 声明时 赋值 int shuzu[5] = {0, 1, 2, 3, 4};

声明时 赋值 1 int shuzu[5] = {0, 1}; 内存 当 数值数目 小于 数组变量数目 时, 剩余的数组变量 被赋值为 0 1 声明时 赋值 int shuzu[5] = {0, 1}; 当 数值数目 小于 数组变量数目 时, 剩余的数组变量 被赋值为 0 这个规律 对float, double, char 类型的数组 也适用!

声明时 赋值 int shuzu[5] = {0, 1}; int shuzu[5] = {0, 1, 0, 0, 0};

字符串

回顾:字符型变量 的 赋值

如何 给一个字符型变量赋予一个特定的值? 基本方法:通过 赋值语句 int main( ){ char b, c, d; b = ‘x’; return 0; } b = ‘x’; c = b; 可以把字符的ASCII编码值 赋给一个字符型变量 d = 120;

编码值为 0 的字符 是什么字符? 字符 x 的编码值是 120 ASCII 编码表

这个字符的 输出效果是什么 一个 特殊 的 字符 编码值为 0 的字符 是什么字符? 答: int main(){ char a; printf("A%cB\n", a); return 0; } 编码值为 0 的字符 是什么字符?

编码值为 0 的字符 int main(){ char a; a = 0; …… return 0; } int main(){

什么是 字符串

什么是 字符串 字符串 是 由 一个或多个 字符 构成 的 序列 you are a student!

在C语言中, 字符串 被实现为 一维字符数组 在C语言中, 字符串 被存储在 一维字符数组 中

在C语言中, 字符串 是 如何 实现/存储 的 在C语言中, 字符串 以 字符‘\0’ 作为结尾

“you are a student!” 如何声明 一个 字符串常量 用 双引号 把 需要表达的字符串 括起来 编译器 负责 在 末尾 添加 一个‘\0’字符

如何声明 一个 字符串变量 第一步: 确定 想要存储的字符串 的 最大长度LEN 第二步: 声明一个 长度为 LEN+1 的 一维字符数组 字符串 以 字符‘\0’ 作为结尾; 需要为 该字符 预留一个存储空间 WHY

字符串变量 一维字符数组

向控制台 输出 字符串 常量

向控制台 输出 字符串常量 printf 函数 方法1: 字符串常量 int main(){ printf(“u r a student”); return 0; }

printf(“you are a stud\0ent”); printf(“\n”); return 0; } int main(){ printf(“you are a stud\0ent”); printf(“\n”); return 0; } 这个程序 的 输出效果 是什么?

向控制台 输出 字符串常量 puts 函数 方法2: int main(){ puts(“u r a student”); return 0; } int main(){ printf(“u r a student\n”); return 0; }

字符串 中 第一个‘\0’字符 之前 的 字符 的 个数 字符串 的 长度 字符串 中 第一个‘\0’字符 之前 的 字符 的 个数 长度为18 “you are a student!” 长度为14 “you are a stud\0ent!”

向控制台 输出 字符串 变量

向控制台 输出 字符串变量 printf 函数 +%s修饰符 方法1: int main(){ char zfc[50]; printf(“%s”, zfc); return 0; }

向控制台 输出 字符串变量 puts 函数 方法2: int main(){ char zfc[50]; … … //赋值 puts(zfc); return 0; } int main(){ char zfc[50]; … … //赋值 printf(“%s\n”, zfc); return 0; }

字符串变量 的 赋值 声明时 赋值 声明后 赋值

声明时赋值 之 烦琐方式 char zfc[LEN] = {‘u’, ‘ ’, ‘r’, ‘ ’, ‘a’, ‘ ’, ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’}; LEN 必须大于 13 请不要使用这种方式! … 1 2 3 4 5 6 7 8 9 10 11 12 13 LEN-1 … u r a s t u d e n t \0 \0

char zfc[LEN] = “u r a student”; 声明时赋值 之 简洁方式 char zfc[LEN] = {‘u’, ‘ ’, ‘r’, ‘ ’, ‘a’, ‘ ’, ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’}; char zfc[LEN] = “u r a student”; char zfc[LEN]; zfc = “u r a student”; u r a s t d e n \0 … 1 2 3 4 5 6 7 8 9 10 11 12 13 LEN-1

声明后赋值 之 从控制台输入 方法1: scanf函数 + %s修饰符 int main(){ char zfc[50]; scanf(“%s”, zfc); printf(“%s\n”, zfc); return 0; } 缺点: 不能接收 包含空格的字符串

声明后赋值 之 从控制台输入 方法2:gets函数 int main(){ char zfc[50]; gets(zfc); printf(“%s\n”, zfc); return 0; }

声明后赋值 之 从控制台输入 方法1: scanf函数 + %s修饰符 方法2:gets函数 请 尽量使用 方法1 除非 字符串中 含有空格

strcpy(目标字符串, 源字符串); 声明后赋值 之 从另一个字符串赋值 方法:“字符串复制”函数 功能:把 源字符串 赋值给 目标字符串 #include <string.h> 注意:调用时,要确保 目标字符串所在数组的长度 大于 源字符串的长度

声明后赋值 之 从另一个字符串赋值 int main(){ char zfc_src[50], zfc_tgt[50]; gets(zfc_src); strcpy(zfc_tgt, zfc_src); printf(“%s\n”, zfc_tgt); return 0; }

char *zfc = “u r a student”; 声明时赋值 之 指针方式 char *zfc = “u r a student”;

字符串 数组 由 字符串变量 构成 的 数组

字符串 数组 字符串变量 一维字符数组 字符串数组 二维字符数组

如何声明 字符串 数组 char zfcsz[N][LEN+1]; 第一步: 确定 数组中存储的字符串 的 最大长度LEN 第二步: 第三步: 声明 一个 行数为N,列数为LEN+1 的 二维字符数组 char zfcsz[N][LEN+1];

如何使用 字符串 数组 int main(){ char zfc_src[50], zfc_tgt[50]; gets(zfc_src); strcpy(zfc_tgt, zfc_src); printf(“%s\n”, zfc_tgt); return 0; } int main(){ char zfc[2][50]; gets(zfc[0]); strcpy(zfc[1], zfc[0]); printf(“%s\n”, zfc[1]); return 0; }

关于 字符串 的 常用函数 strcpy(目标字符串,源字符串) strlen(字符串) strcmp(字符串A,源字符串B) strcat(目标字符串,源字符串) strlwr(字符串) strupr(字符串) 使用这些函数前,需要#include <string.h>

strcpy(目标字符串, 源字符串); “字符串复制”函数 功能:把 源字符串 赋值给 目标字符串 int main(){ char zfc_src[50], zfc_tgt[50]; gets(zfc_src); strcpy(zfc_tgt, zfc_src); printf(“%s\n”, zfc_tgt); return 0; }

int strlen(字符串); “获得字符串长度”函数 int main(){ char zfc[100]; gets(zfc); printf(“%d\n”, strlen(zfc)); return 0; }

int strcmp(字符串A, 字符串B); “字符串比较”函数 int strcmp(字符串A, 字符串B); 功能: 比较 两个字符串 的 大小

int strcmp(字符串A, 字符串B); “字符串比较”函数 int strcmp(字符串A, 字符串B); 当 字符串A 和 字符串B 相等时, 该函数 返回0 对于 字符串A 和 字符串B, 当且仅当 两者的长度相等,且 结尾字符‘\0’前的对应字符均相等 时 称:这两个字符串相等,

int strcmp(字符串A, 字符串B); “字符串比较”函数 int strcmp(字符串A, 字符串B); result == 0 int result = strcmp(“Hello!”, “Hello!”); result != 0 int result = strcmp(“Hello!”, “hello!”); result == 0 int result = strcmp(“Hel\0lo!”, “Hel\0lo”);

int strcmp(字符串A, 字符串B); “字符串比较”函数 int strcmp(字符串A, 字符串B); 当 字符串A 和 字符串B 不相等时, 该函数 返回: 两个字符串中第一对不相等的字符 对应的ACSII码值的差 result == -32 int result = strcmp(“helloH”, “helloh”);

字符 H 的编码值是 72 字符 h 的编码值是 104 72 – 104 == -32

int strcmp(字符串A, 字符串B); “字符串比较”函数 int strcmp(字符串A, 字符串B); 当 字符串A 和 字符串B 不相等时, 该函数 返回: 两个字符串中第一对不相等的字符 对应的ACSII码值的差 result == 32 int result = strcmp(“helloh”, “HelloH”);

int strcmp(字符串A, 字符串B); “字符串比较”函数 int strcmp(字符串A, 字符串B); 字符串比较:对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。例如: "A"<"B","12"<“123" ,"123"<"2", "there">"that" strcmp函数返回一个整数,其意义: 如果函数返回值为0,则字符串1 和 字符串2 的内容相同 如果函数返回一个正整数,则字符串1 > 字符串2 如果函数返回一个负整数,则字符串1 < 字符串2 strcmp("A", "B") < 0 strcmp("there", "that") > 0 strcmp("abc", "abc") == 0 不能用==比较字符串内容: str1==str2 "abc"=="abc"的值为?

strcat(目标字符串, 源字符串); “字符串连接”函数 功能:把 源字符串 添加到 目标字符串 的结尾 注意:调用时,要确保 目标字符串所在数组的长度 大于 源字符串的长度 +目标字符串的长度

strcat(目标字符串, 源字符串); “字符串连接”函数 int main(){ char zfc_src[50], zfc_tgt[100]; gets(zfc_tgt); gets(zfc_src); strcat(zfc_tgt, zfc_src); printf("%s\n", zfc_tgt); return 0; }

“大写字母变小写”函数 strlwr(字符串); “小写字母变大写”函数 strupr(字符串);

int main(){ char zfc[100]; gets(zfc); strlwr(zfc); printf("%s\n", zfc); strupr(zfc); return 0; } 注意:这两个函数 在编程网格中 不支持!

sprintf(字符数组, 格式控制, 变量列表) 另一个常用的字符串函数: sprintf(字符数组, 格式控制, 变量列表) 与printf()函数的作用相似,但是将输出结果送到字符数组中,形成字符串。 #include <string.h> void main() { char s1[50]; int a=20; double b=3.1416; sprintf(s1,”An int %d and a double %f.”, a, b); printf("%s", s1); } (注意字符数组S1的长度) S1的值为:An int 20 and a double 3.141600.

字符串应用的例子 求字符串中大写字母的个数(使用strlen()) #include <stdio.h> #include <string.h> void main() { char str[256]; int count = 0, len; scanf("%s", str); len = strlen(str); for ( int i = 0; i<len; i++ ) if ( str[i] >= 'A' && str[i] <= 'Z' ) count++; } printf("%s has %d uppercases\n", str, count);

自己实现strlwr()和strupr() 问题:如何将一个字符串中的大写字母变为小写字母,而小写字母则变为大写字母? #include <stdio.h> #include <string.h> void main() { char str[256]; int count = 0, len; scanf("%s", str); len = strlen(str); for ( int i = 0; i<len; i++ ) if ( str[i] >= 'A' && str[i] <= 'Z' ) str[i] = str[i] – ‘A’ + ‘a’; else if ( str[i] >= ‘a' && str[i] <= ‘z' ) str[i] = str[i] – ‘a’ + ‘A’; } printf("%s\n", str); 如果把“else”去掉,结果会怎样? 注意:可以仿照这个方法, 自己实现strlwr()和strupr()

课堂作业 请同学们拿出笔和纸, 1. 写下 姓名和学号; 2. 写下 满足上述要求的程序;