当前位置:文档之家› 第7章 字符数组与字符串

第7章 字符数组与字符串


字符型溢出问题
解决问题: 字符加密
输入一个英文小写字符和正整数k(k<26), 将英文字母加密并输出。
加密思想:将每个字母c加一个序数k,即 用它后面的第k个字母代替,变换公式: c=c+k。如果字母为z,则后一个字母是a, 也就是字母表形成一个圆。
源程序7-1:char类型溢出
#include<stdio.h>
数字 转义序列
字符转义序列使用起来很容易,但数量有限,并没有 包含所有无法打印的ASCII字符。C语言提供了数字转义序 列。所有ASCII码字符,都可以用数字转义序列来表示。 可以用八进制数或十六进制来书写转义字符。
八进制转义序列:由\和跟随其后的最多含有三位数字 的八进制数组成。例如,'a'的ASCII码对应的八进制是 141,则数字转义序列'\141'就表示'a'。
解决方法2:分类处理,避免溢出
#include<stdio.h>
int main() {
char ch; int k;
scanf("%c %d", &ch, &k);
if(ch + k > 'z') ch = ch + k - 26;
else ch = ch + k;
若ch + k > ’z’,则减去26后 存储,避免存储时溢出
在计算ch + k 的过程中不会 溢出,因为因为编译器把算 术运算中涉及的char类型都 提升为int类型
printf("%c\n", ch); return 0; }
注意计算过程中的溢出
其实有更多的类型溢出是发生在计算阶段,例如 表达式:k = 123456 * 123456 / 123456, 虽然结 果不会超出int范围,但在计算过程中,中间结果超出 int范围,也将发生溢出。
signed char: -128 至 +127
‘z’+6 的 值 是 128 超 出 char 表 示范围
printf("%c\n", ch); return 0; }
解决方法1:使用unsigned char
#include<stdio.h>
int main() {
unsigned char ch;
char name[15] = { 'W', 'a',
'n', 'g', 'L', 'i'};
用字符数组
char d = 'g';
char e = 'L';
char f = 'i';用若干个字符
用字符串char name[15] = “Wang Li”;
7.2.1统计空格
解决问题:输入一行字符(字符个数不多于 80),统计其中空格的个数 解题思路: (1)定义字符数组 str[81]; (2)读入字符串 若字符串确定不含空格,可以用 scanf(“%s”,&str); 若可能含有空格,用gets(str); (3)扫描整个字符串(不需要知道字符个数)
40 (
62
>
125
}
41 )
63
?
126
~
42 *
64
@
127
DEL
43
+
65 ~ 90 A ~ Z
字符数据类型
占 8 位内存
unsigned 0 至 255
signed 或
unsigned
Signed -128 至 +127
在C语言中,字符和整数之间存在着密切的关 系。C语言把字符当成小整数进行处理。
字符 转义序列
转义序列 \a \b \f \n \r \t \v \' \" \? \\ \0
名称 警告 退格 换页 换行 回车 水平制表 垂直制表 单引号 双引号 问号 反斜线 空
描述 产生一则警告。 将光标回退一格。 将光标移到下一页的第一格。 将光标移到下一行的第一格。 将光标移到当前行的第一格。 将光标移到下一个水平制表位置。 将光标移到下一个垂直制表位置。 产生一个单引号。 产生一个双引号。 产生一个问号。 产生一条反斜线。 产生一个空字符。
十六进制转义序列:由\x和跟随其后的十六进制数组成。 例如,'a'的ASCII码对应的十六进制是61,则数字转义序 列'\x61'就表示'a'。
数字转义序列(部分)
八进制转义序列 十六进制转义序列
\7
\x7
\10
\x8
\12
\x0C
\10
\x0A
\40
\x20
\60
\x30
\101
\x41
\141
格式串中的%c之前加上一个空格: scanf("%d", &n); scanf(" %c", &ch);
scanf格式串中的空白意味着“跳过零个或多个空白字符” 。
7.1.4 字符处理函数
前面已经讲过如何把小写字母转换成大写字母:
if(ch >= 'a' && ch <= 'z')
ch = ch - 32; 其实可以使用库函数toupper()来完成上述操作,即
int k;
scanf("%c %d", &ch, &k); ch = ch + k;
unsigned char: 0 至 255
一个英文小写字符和正 整数k(k<26)的和, 不会#39;) ch = ch - 26;
printf("%c\n", ch); return 0; }
#include<stdio.h> int main() {
int k = 123456 * 123456 / 123456; printf("%d\n", k); return 0; } 该程序无法得到正确结果,是因为计算 123456 * 123456的 结果超出了int类型的表示范围。 避免此类问题的方法: 1、选择表示范围更大的数据类型 2、先除后乘,但要解决好整数除法带来的问题。
重写程序4-13:字符分类统计
letter = digit = other = 0;
while(ch = getchar(), ch != '\n')
{
if( isalpha(ch) )
/*若ch是字母*/
letter++;
else if( isdigit(ch) ) /*若ch是数字*/
digit++;
\x61
响铃 退格键 换页键 换行键 空格 0 A a
描述
printf(“a\10b\n”); //输出: b, 因为转义序列’\10’是 退格键 printf(“\141\10\142\n”); //输出: b, 含义同上
7.1.3 字符数据的输入输出
scanf()函数和getchar()都可以用来读入单个字 符。但与整型和实型数据的读入不同的是, 所有输入都是合法的字符输入,包括空格、 回车等空白符。
else
/*其他字符*/
other++;
}
ctype.h头文件中的部分函数
函数
功能
tolower() toupper() islower() isupper() isalpha() isdigit() isxdigit() isblank()
转换为小写字母
转换为大写字母
判断是否是小写字母
判断是否是大写字母
判断是否是小写或大写字母
判断是否是十进制数字('0'-'9') 判 断 是 否 是 十 六 进 制 数 字 ( '0'-'9' , 'a'-'f','A'-'F') 判断是否是空白字符(空格,'\t')
7.2 字符数组与字符串
Wang Li
如何让程序存储我的姓名?
char a = 'W'; char b = 'a'; char c = 'n';
"Hello World"
"WangPing"
"Please enter your full name:"
“Hello!\n"
字符串常量中可以包含转义序列
He l l o
W o r l d \0
字符串结束符
字符串的有效长度:有效字符的个数
字符串的存储
char s[80] = "Happy"; 字符串遇 '\0' 结束 第一个 '\0' 前面的所有字符和 '\0' 一起构成了字
符串 "Happy” '\0' 之后的其他数组元素与该字符串无关
字符串由有效字符和字符串结束符 '\0' 组成
s H a p p y \0 \0 \0 …
s[0] s[1]
s[5]
字符串与字符数组
在C语言中没有专门的字符串变量,通常用一个 字符数组来存放一个字符串
字符数组和字符串的区别是:字符串的末尾有一 个空字符 ‘\0’
7.1.2 转义序列
相关主题