欢迎来到我的博客!💃💃
🏡🏡推荐博客:August_._一起持续学习,不断总结,共同进步🎊🎊
文章目录
字符类型
当今最常用的字符集是美国信息交换标准码( ASCII )字符集,它用7位代码表示128个字符。在 ASCII码中,数字0—9用0110000—0111001码来表示,大写字母 A — Z 用1000001—1011010码来表示。 ASCII码常被扩展用于表示256个字符,相应的字符集 Latin -1包含西欧语言和许多非洲语言中的字符。
char 类型的变量可以用任意单字符赋值:
char ch ;
ch = 'a';
ch = 'A';
ch = '0';
ch = ' ';
注意,字符常量需要用单引号括起来,而不是双引号。
用 getchar 和 putchar 读/写字符
putchar 函数用于写单个字符
putchar ( ch );
getchar 函数会读入一个字符并将其返回。
为了保存这个字符,必须使用赋值操作将其存储到变量中:
ch = getchar ();
事实上, getchar 函数返回的是一个 int 类型的值而不是 char 类型的值。
因此,如果一个变量用于存储 getchar 函数读取的字符,其类型设置为 int 而不是 char 也没啥好奇怪的。和 scanf 函数一样, getchar 函数也不会在读取时跳过空白字符。
类型转换
表达式中的类型自动转换规则:
强制类型转换:(一元运算符)
(类型名)表达式
sizeof运算符
sizeof 运算符允许程序获取存储指定类型的值所需要的内存空间。
表达式
sizeof (类型名)
代表存储属于类型名的值所需要的字节数,值是一个无符号整数
sizeof 作为一元运算符的优先级高于二元运算符,编译器会把表达式
sizeof i + j
解释为(sizeof i) + j ,
为了避免出现此类问题,在 sizeof 表达式中始终加上圆括号。
字符串
字符串的读和写
使用 printf 函数或 puts 函数来写字符串是很容易的。读字符串却有点麻烦,主要是因为输入的字符串可能比用来存储它的字符串变量长。为了一次性读入字符串,可以使用 scanf 函数,也可以每次读入一个字符。
1、用printf函数和puts函数写字符串
转换说明% s 允许 printf 函数写字符串。考虑下面的例子:
char str[]=" Are we having fun yet ?";
printf ("%s\n", str);
输出:
Are we having fun yet ?
printf 函数会逐个写字符串中的字符,直到遇到空字符才停止。(如果空字符丢失, printf 函数会越过字符串的末尾继续写,直到最终在内存的某个地方找到空字符为止。)
如果只想显示字符串的一部分,可以使用转换说明%. ps ,这里 p 是要显示的字符数量。
语句
printf ("%.6s\n ", str);
会显示
Are we
转换说明 %ms 会在大小为 m 的栏内显示字符串:
- 对于超过 m 个字符的字符串, printf 函数会显示出整个字符串,而不会截断。
- 如果字符串少于 m 个字符,则会在栏内右对齐输出。
- 如果要强制左对齐,可以在 m 前加一个减号。
m 值和p 值可以组合使用:
转换说明%m.ps 会使字符串的前 p 个字符在大小为 m 的栏内显示。
除此之外C 函数库还提供了 puts 函数:
puts (str);
puts 函数只有一个参数——需要显示的字符串。在写完字符串后, puts 函数总会添加一个额外的换行符,从而前进到下一个输出行的开始处。
2、用scanf函数读字符串
转换说明%s允许 scanf 函数把字符串读入字符数组:
scanf (“%s”, str);
在 scanf 函数调用中,不需要在 str 前添加运算符&,因为 str 是数组名,编译器在把它传递给函数时会把它当作指针来处理。
以%s格式输入字符串时,空格、回车键或Tab键是字符串输入结束的标志。
记住: 用 scanf 函数读入字符串永远不会包含空白字符。
为了一次读人一整行输入,我们使用gets 函数——把读入的字符放到数组中,然后存储一个空字符。
gets 函数不同于 scanf 函数之处:
- gets 函数不会在开始读字符串之前跳过空白字符( scanf 函数会跳过)。
- gets 函数会持续读入,以回车作为字符串输入结束的标志( scanf 函数会在任意空白字符处停止)。
此外, gets 函数会忽略换行符,不会把它存储到数组中,并用空字符代替换行符。
使用C语言的字符串库
C 语言的函数库为完成对字符串的操作提供了丰富的函数集。这些函数的原型驻留在<string.h>头中,所以需要字符串操作的程序应该包含下列内容:
#include <string.h>
<string.h>中有许多函数,这里将介绍几种最基本的。
1、strcpy 函数
strcpy (字符数组1, 字符串2)
例如:strcpy (str1,str2)
strcpy函数把str2中的字符复制到str1中,直到遇到str2中的第一个空字符为止(该空字符也要复制),strcpy函数返回str1。
注意:
strcpy (str1, str2)调用中,无法检查str2指向的字符串的大小是否适合str1指向的数组。如果 str2长度长于str1,那么结果就无法预料了。
拓展:
strncpy (str1, str2, sizeof (str1));
第三个参数可以用于限制所复制的字符数。
strncpy 本身也不是没有风险。如果str2中存储的字符串的长度大于str1数组的长度, strncpy 会导致str1中的字符串没有终止的空字符。
下面是一种更安全的用法:
strncpy ( strl, str2, sizeof (str1) -1);
str1[ sizeof (str1)-1]='\0';
第二条语句确保str1总是以空字符结束,即使 strncpy 没能从str2中复制到空字符。
strncpy函数比 strcpy更安全,但是速度也慢一些。
2、strlen 函数
strlen (字符数组)
作用:
返回字符串的长度:第一个空字符之前的字符个数(不包括空字符)。
int len ;
len = strlen ("abc"); /* len is now 3*/
len = strlen (""); /* len is now 0*/
strcpy (strl ,"abc");
len = strlen ( strl ); /* len is now 3*/
最后一个例子说明:当用数组作为实际参数时, strlen 不会测量数组本身的长度,而是返回存储在数组中的字符串的长度。
3、strcat 函数
strcat (字符数组1,字符数组2)
注意:
- 字符数组1的长度应足够大,以至于能存放下连接字符数组2中的所有字符。
- 做字符串连接strcat操作时,原字符串1后面的’\0’ 取消,在新字符串1的末尾增加一个 ‘\0’ 。
拓展:
strncat (str1, str2, sizeof (str1) - strlen (str1) - 1);
该函数再遇到空字符时终止str1,第三个参数(待复制的字符数)没有考虑该空字符。
strncat函数比strcat更安全,但是速度也慢一些。
4、strcmp 函数
strcmp (字符串1,字符串2)
类似于字典中单词的编排方式,strcmp函数利用字典顺序进行字符串比较
当比较两个字符串中的字符时, strcmp 函数会查看字符对应的数值码。下面是 ASCII 字符集的一些重要性质。
- A ~ Z 、 a ~ z 、0~9这几组字符的数值码是连续的。
- 所有的大写字母都小于小写字母。(在 ASCII 码中,65—90的编码表示大写字母、97—122的编码表示小写字母。)
- 数字小于字母。(48~57的编码表示数字。)
- 空格符小于所有打印字符。( ASCII 码中空格符的值是32。)
strcmp函数比较字符串的大小,分以下3种情况:
- 字符串1>字符串2,函数返回值为正整数。
- 字符串1=字符串2,函数返回值等于0。
- 字符串1<字符串2,函数返回值为负整数。