第六章 字符串和文本的应用

城中桃李愁风雨,春在溪头荠菜花。

存储字符串的变量

定义一个字符串:

char saying[20];

这个变量最多可以存储19个字符串因为必须存储一个终止符 \0

声明存储字符串存储的数组时,其大小至少要比存储的字符数多1, 因为编译器会自动在字符串常量的末尾添加\0

也可以用一个字符串初始化char类型数组的部分元素,例如:

char str[40] = “Tobe”;

这里编译器会将这四个字符分配到数组的前四个单元str[0]--str[3], str[4]中存放终止符

要引用存储在数组中的字符串时, 只需使用数组名即可, 例如,如果要输出存储在message中的字符,可以编写:

printf(“\nThe message is: %s”, message);

也可以使用char类型的二维数组存储字符串,数组中的每一行都用来存储一个字符,这样就可以存储一整串字符

1
2
3
4
5
char sayings[3][32] = {
"manners marketh man.",
"many hands make light work.",
"Too many cooks spoil the broth."
};

字符串操作

标准库中提供了很多处理字符串的函数,要使用这些函数,必须把string.h头文件包含在源文件中

确定字符串的长度

strlen(str) 返回字符串str的长度,返回值为整型

看下面的例子

1
2
char s[] = "abcdef";
unsigned len = strlen(s); //len = 6

有个疑问,在使用这个函数的时候没有使用<string.h>头文件,然后也没有报错,但是报了下面的警告:

[Warning] incompatible implicit declaration of built-in function ‘strlen’

[警告] 内置函数“strlen”的隐式声明不兼容

解决方案:添加<string.h>头文件可以解决这个问题,但是问题是为什么不添加这个头文件,只警告但是不报错。

复制字符串

strcpy(str1, str2) 将字符串str2中的内容复制到str1中

1
2
3
4
5
6
char s2[] = "hello world";
char s3[strlen(s2)];

strcpy(s3, s2);

printf("\n%s", s3); // hello world

strcpy(str1, str2) 中str1,是将要复制到的字符串,str2是源字符串

拼接字符串

strcat(str1, str2) 将字符串str2拼接到str1的后面,返回的是str1的第一个字符

1
2
3
4
5
6
char str1[] = "hello";
char str2[] = "world";

strcat(str1, str2);

printf("%s", str1);

字符串的比较

听起来比较特别,字符串怎么进行比较,无非就是比较字符串是否一样

如果两个字符串是相同的,它们就是相等的,要确定第一个字符串是大于还是小于第二个字符串,应该比较两个字符串中第一对不同的字符:

1
2
3
4
5
6
7
8
char str1[] = "The quick brown fox";
char str2[] = "The quick black fox";

if(str1 > str2){
printf("yes");
} else{
printf("no");
}

搜索字符

strchar()用法如下

1
2
3
4
5
6
7
8
9
10
char str[] = "The quick brown fox";
char ch = 'q';
char *pgotchar = NULL;
pgotchar = strchr(str, ch);

//那么如何返回这个字符是在第几个位置呢

printf("%d", str);
printf("\n%d", pgotchar);
printf("\n%d", pgotchar - str); // 4

strchar()中有两个参数,第一个是字符串数组,第二个是字符

返回值是字符在字符串地址中的地址,可以用一个指针接收

这个函数的返回值减去字符串数组的初始位置的地址就是这个字符在字符串中的位置(下表从0开始)

这是因为一个地址代表一个字节,而一个字符的大小刚好是一个字节。

如果找不到这个字符,那么就会返回NULL NULL的值是0

搜索字符串

strstr()用法如下:

1
2
3
4
5
6
7
8
char text[] = "Every dog has his day";
char word[] = "dog";
char *pFound = NULL;
pFound = strstr(text, word);

printf("%d", text);
printf("\n%d", pFound);
printf("\n%d", pFound - text); //6

strchar()的用法一样, 返回的是一个指针

两个参数,前一个参数是原字符串,后一个参数是要查找的子字符串

两个指针相减得到的就是子字符串在原字符串中的位置(下标从0开始)

分析和转换字符

在使用下面的函数的时候要加上头文件<ctype.h>

字符串转换成数值

使用下面的函数的时候要加上头文件<stdlib.h>

下面是一个字符串转化为double类型的例子

char value_str[] = “98.4”;

double value = atof(value_str);

还有一些高级的函数,可以把几个字符串转化为一个字符串