
程序设计基础 第10章字符串 1/26
程序设计基础 1/26 第10章 字符串

本章内容 ■10.1字符串常量 ■10.2如何表示字符串变量(重点) ■10.3字符串的输入输出 ■10.4字符串处理函数(重点) ■10.5字符指针与字符数组的区别(难点) ■10.6程序举例 恩 2/26
2/26 ◼10.1 字符串常量 ◼10.2 如何表示字符串变量(重点) ◼10.3 字符串的输入输出 ◼10.4 字符串处理函数(重点) ◼10.5 字符指针与字符数组的区别(难点) ◼10.6 程序举例 本章内容

指向字符串的指针变量 str 1、字符串表示形式 string[0] > 用字符数组实现 string[1] string[2] int main() string 0 string[3] string[4] char str[=“Ilove China!”; e string[5] printf(%sln”,str)月 string[6] printf(%sln”,str+);str常量,不可改变 0 C string[⑦I return 0; h string[8] i string 9] > 用字符指针实现 n string 10] int main() string→ C a string[11] { h string[12] char *string="I love China!"; i 0 string[13] printf("%s\n",string); n string+=7;//string指针变量,可改变 9 运行结果: printf("%s\n",string); I love China! return 0; China! 0 3/10
指向字符串的指针变量 1、字符串表示形式 ➢ 用字符数组实现 int main ( ) { char str[] = “I love China!”; printf (“%s\n”, str); printf (“%s\n”, str + 7); //str常量,不可改变 return 0; } I l o v e C h i string[0] string[1] string[2] string[3] string[4] string[5] string[6] string[7] string[8] string[9] str string[10] string[11] string[12] string[13] n ! a \0 运行结果: I love China! China! 3/10 ➢ 用字符指针实现 int main ( ) { char *string = “I love China!”; printf (“%s\n”, string); string += 7; //string指针变量, 可改变 printf (“%s\n”, string); return 0; } I l o v e C h i string n ! a \0 string

例在输入的字符串中查找有无‘k字符 int main() ps st charst[141,*ps; &st[0] st[O] printf("input a string:In"); st[1] ps=st; st[2] scanf("%s",ps); 0 st[3] for(;*ps=10';ps++) v st[4] if(*ps=='k') e printf("There is a 'k'in the stringIn"); st [5] break; C h if(*ps="10 n printf("There is no 'k'in the stringln"); a } st[12] return 0; 0 st[13] example7_4_1 4/10
例 在输入的字符串中查找有无‘k’字符 int main() { char st[14],*ps; printf("input a string:\n"); ps=st; scanf("%s",ps); for( ; *ps!='\0'; ps++) { if(*ps=='k') { printf(“There is a 'k' in the string\n"); break; } } if(*ps=='\0') { printf("There is no 'k' in the string\n"); } return 0; } st[0] st[1] st[2] st [3] st [4] st [5] 。 。 。 st st [12] st [13] I l o v e C h i st[0] st[1] st[2] st [3] st [4] st [5] 。 。 。 st st [12] st [13] n ! a \0 ps &st[0] 4/10 example7_4_1

2、字符数组与字符指针变量 str char str[20];5 char *cp; 分配存放 st[0]数组元素 ●str由若干元素组成,每个元素放一个字符 数组元素 st[1] 存储空间 cp中存放字符串首地址 st[2] ●char str[2o];str=“I love China!'"; () 0 st[3] strcpy(str,"I love China!");( st[4] char *cp; cp=Ilove China!";(√) e st [5] ●cp接受键入字符串时 必须先开辟存储空间 c 分配存放 C ●str是地址常量 指针变量 h cp是指针变量 存储空间 i 0 n a C st[12] 0 st[13] i n a 恩 5/10
2、字符数组与字符指针变量 char str[20]; 与 char *cp; ⚫ str由若干元素组成,每个元素放一个字符; cp中存放字符串首地址 ⚫ char str[20]; str=“I love China!”; () strcpy(str, “I love China!”); (✓) char *cp; cp=“I love China!”; (✓) ⚫cp接受键入字符串时 必须先开辟存储空间 ⚫str是地址常量 cp是指针变量 5/10 I l o v e C h i st[0]数组元素 st[1] st[2] st [3] st [4] st [5] 。 。 。 str 分配存放 数组元素 存储空间 st [12] st [13] n ! a \0 I l o v e C h i cp 分配存放 指针变量 存储空间 n ! a \0

3、字符指针变量使用注意事项 “野指针”操作: 如果一个指 被称为 “野指针” 不会出 错,但很容 甚至 崩溃。 char *pstr; char str[8]; scanf("%s",pstr);/野指针操作,pstr没有指向有效内存 strcpy(pstr,"hello'");/野指针操作 pstr=str;pstr指向数组str所对应内存单元的首地址 strcpy(pstr,"0123456789");1/不是野指针,但会造成数组越界 恩 6/10
3、字符指针变量使用注意事项 “野指针”操作: 如果一个指针没有指向一个有效内存就被引用,则被称为 “野指针”操作或空指针赋值。野指针操作尽管编译时不会出 错,但很容易引起程序运行时表现异常,甚至导致系统崩溃。 char *pstr; char str[8]; scanf ("%s",pstr); //野指针操作,pstr没有指向有效内存 strcpy (pstr, "hello"); //野指针操作 pstr = str; //pstr指向数组str所对应内存单元的首地址 strcpy (pstr, "0123456789"); //不是野指针,但会造成数组越界 为什么“野指针” 操作会给程序运行带来 极大的不确定性,甚至 造成系统崩溃呢? 6/10

为什么“野指针”赋值会给程序运行带来极大的危险? 指针pstr所占 内存 指系统程序区 pstr0001 char *pstr; pstr=“abc”; 再次提醒: 指针变量只有与内存建立联系以后才可使用,否则将 造成程序运行异常,甚至导致系统死机! char str[10],*pstr; pstr=srt; pstr=“abc”; 极其危险! 恩 7/10
系统程序区 0001 pstr 0001 指针pstr所占 内存 char *pstr; pstr =“abc”; 随机值,有可能 指向系统程序区 假设首地址为 0001 此时对pstr指 向的内存单元 赋值 极其危险! 为什么“野指针”赋值会给程序运行带来极大的危险? 再次提醒: 指针变量只有与内存建立联系以后才可使用,否则将 造成程序运行异常,甚至导致系统死机! char str[10], *pstr; pstr=srt; pstr=“abc”; 7/10

【例】利用字符指针实现字符串的倒序排列 程序执行过程演示: str 交换 a 'n'h''C' e'v''o'L'' p=str; q=p+strlen(p)-1 夏 8/10
'I' ' ' 'L' 'o' 'v' 'e' ' ' 'C' 'h' 'i' 'n' 'a' '!' 0 str p q p = str; q = p + strlen(p) - 1 交换 '!' 'I' p q 'a' p q 'n' 'L' p q 'i' 'o' p q 'h' 'v' ' ' p q 'C' 'e' 交换 p q ' ' End 程序执行过程演示: 【例】 利用字符指针实现字符串的倒序排列 8/10

【例】利用字符指针实现字符串的倒序排列 #include #include int main ( char str[2001,ch; char *p,*q; gets (str); /读取一个字符串 p=str; p指向字符串的首地址 q=p+strlen(p)-1;/q指向字符串的末地址 while (p<q) /交换p和q各自指向的字符 ch *p; /将p所指向的字符保存在ch中 *p十+=*q /先将q指向的字符赋给p指向的字符单元,p再增1 *q-=chj /先将ch的值赋给q指向的字符单元,q再减1 运行结课: printf ("%s\n",str); I love China! return 0; !anihC evol I 10
【例】 利用字符指针实现字符串的倒序排列 #include #include int main ( ) { char str[200], ch; char *p, *q; gets (str); //读取一个字符串 p = str; //p指向字符串的首地址 q = p + strlen(p) - 1; //q指向字符串的末地址 while (p < q) { //交换p和q各自指向的字符 ch = *p; //将p所指向的字符保存在ch中 *p++ = *q; //先将q指向的字符赋给p指向的字符单元,p再增1 *q- = ch; //先将ch的值赋给q指向的字符单元,q再减1 } printf ("%s\n", str); return 0; } 运行结果: I love China! ↙ !anihC evol I 9/10