字符串和文本的应用
C语言使用char类型的数组元素存储字符串。
1 什么是字符串
双引号之间的任何字符,包括转义后的符号,空格,回车等字符。字符串以”\0”结束。1
2
3
4
5
6
7
int main()
{
printf("The character \0 is used for terminate a string."); //显示"The character "
return 0;
}
2 处理字符串和文本的方法
1 | char saying[20]; |
这条语句可以存储一个至多包含19个字符的字符串。
用const将字符串声明为常量:1
const char message[]="The end of the world is nigh.";
2.1 确定字符串长度
1 |
|
2.2 用strlen确定长度
1 |
|
3 字符串操作
将字符串赋值给另一字符串,不能像int那样用”=”,而要用专门函数来将字符一个个传入。
3.1 连接字符串
1 |
|
第12、13行可用下列一行代替:
while(s1[i++] = s2[j++]);
因为括号内是一个赋值语句,如果s1[i++]不是”\0”,那条件就为真,继续复制,直到s2将”\0”传过来。
3.2 字符串数组
1 |
|
1 |
|
4 字符串库函数
字符串函数在<string.h>头文件中
4.1 使用库函数复制字符串
1 | if(sizeof(string2) <= sizeof(string1)) |
复制前n个字符:1
2
3
4
5
6
7
8
9
10
11
int main()
{
char destination[] = "This string will be replaced";
char source[] = "This string will be copied in part";
size_t n = 26;
strncpy(destination, source, n);
printf("%d, %s", sizeof(destination), destination);
return 0;
}
由于string是从source直接copy到destination中,所以如果sizeof(source) > sizeof(destination),那destination中就没有’\0’了,所以上例中的n也不要大于sizeof(destination)。
4.2 使用库函数确定字符串的长度
#include <stddef.h>
size_t count = 0;
count = strlen(string);
这个计数不包括’\0’,而sizeof(string)包括。
4.3 使用库函数连接字符串
strcat(str1, str2); //copy str2 to the end of str1
1 |
|
如果用sizeof代替strlen,则57 -> 31。
4.4 比较字符串
strcmp(string1, string2); //以ASCII码确定大小
1 |
|
4.5 搜索字符串
4.5.1 指针的概念
指针是变量类型,它是含有地址的变量。1
2int number = 99;
int *pnumber = &number;
number里含有的是地址,该地址里的内存含有99这个常量。&number现在是指向99的地址,是一个地址!pnumber是一个指针变量,用”int *”定义,所以pnumber这个变量存的是number这个常量所在的地址!1
2
3
4
5
6
7
8
9
10
int main()
{
int i = 333;
int *p = &i;
printf("%p\n", i); //%p用于显示地址,这里显示8个16进制组成的地址,该地址里存放333这个常量。本机32位。
printf("%p", *p); //和上面一行显示相同的地址,也就是p这个变量存放的地址。指针变量p指向变量i,变量i里存放333。
return 0;
}
比如,假设我的内存是4GB,那就有约4,000,000,000个byte。那么”0000,0000”就指向第一个byte,”ffff,ffff”指向最后一byte。再假设”int i”时,系统给”i”分配的是第15号空间,即”0000,000f”,因为int占4个字节,所以”0000,000f”,”0000,0010”,”0000,0011”和”0000,0012”这4个字节里存放的就是333这个int常量。因为p指向i,所以p里存放”0000,000f”这么一个地址。当系统通过p来使用333时,先看p,即”0000,000f”,就转向地址为”0000,000f”的内存空间。*是取消引用运算符,其作用是访问指针指定的地址中存储的数据。
4.5.2 在字符串中查找子字符串
1 |
|
5 分析和转换字符串
5.1 用gets读入字符串
1 |
|
使用fgets函数可以确保写入安全。fgets(buffer, sizeof(text), stdin)是从stdin获取大小为text串大小的串,然后只要buffer[strlen(text)-1]=’\0’,读入就安全了。
5.2 将字符串转换成数值
atof() //字符串参数转换成double类型的值
atoi() //int
atol() //long
atoll() //long long
1 |
|
6 小程序
6.1 问题
从键盘读入任意长度的一段文本,确定该文本中每个单词出现的频率(忽略大小写)。
6.2 分析
- 使用fgets()
- 文本包含标点,删除之
- 用空格来区分单词,将单词存入另一个数组中,小写保存
6.3 解决方案
1 |
|
7 练习
7.1 数值以英文显示
1 |
|
7.2 一行显示一个单词
1 |
|
7.3 随机显示一段文本
1 |
|
7.4 回文
1 |
|